Показать сообщение отдельно
Старый 13.09.2009, 21:26   #19  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от ViV Посмотреть сообщение

Вопрос про блок
X++:
 where factureJour.FactureId              == factureTrans.FactureId
        && factureJour.Module                 == module
        && factureJour.CustVendInvoiceAccount == this.InvoiceAccount
На таблице FactureJour_RU индекс FactureIdx (FactureId и Module) уникальный.
Следует ли отсюда, что условие "&& factureJour.CustVendInvoiceAccount == this.InvoiceAccount" лишнее?
Цитата:
Сообщение от ViV Посмотреть сообщение
...
Так зачем потом еще фильтр по контрагенту? Ведь даже если мы накладные расходы разбили по нескольким фактурам (не знаю зачем) то контрагент то все равно один. Или все-таки бывают варианты?.
Данное условие не совсем лишнее, конечно, если для вашего сервера СУБД лучше использовать запрос(т.е. склеивать таблицы в ниже приведенном порядке), то, наверное, можно обойтись и без него:
Цитата:
Сообщение от mazzy Т.е. нужно делать примерно так
X++:
// Header markups
// SHiSHok.FRA_Optimize -->
factureJour.clear();
while select RecId from markupTrans
   where markupTrans.TransRecId             == this.RecId
       && markupTrans.TransTableId           == this.TableId
    join RecId from factureTrans
    where factureTrans.MarkupRefRecId        == markupTrans.RecId
       && factureTrans.Module == module
       && factureTrans.FactureLineType       == FactureLineType_RU::Markup
     join * from factureJour index CustVendModuleIdx
     where factureJour.FactureId              == factureTrans.FactureId
        && factureJour.Module                 == module
        && factureJour.CustVendInvoiceAccount == this.InvoiceAccount
Если же взглянуть на первоначальный вариант(до оптимизации):
Цитата:
Сообщение от SHiSHok Посмотреть сообщение
X++:
 DIS :
 
        // Header markups
        while select factureJour
            join RecId from factureTrans
            join RecId from markupTrans
            where factureJour.Module                 == module                          &&
                  factureJour.CustVendInvoiceAccount == this.InvoiceAccount             &&
                  factureTrans.FactureId             == factureJour.FactureId           &&
                  factureTrans.Module                == module                          &&
                  factureTrans.FactureLineType       == FactureLineType_RU::Markup      &&
                  markupTrans.RecId                  == factureTrans.MarkupRefRecId     &&
                  markupTrans.TransTableId           == this.TableId                    &&
                  markupTrans.TransRecId             == this.RecId
        {
            if ( ! ret.find(factureJour))
            {
                ret.ins(factureJour);
            }
        }
То, по всей видимости, данное условие, нужно для того, чтобы существенно уменьшить выборку по фактурам.

P.S. Мне не понятно - другое, в варианте после оптимизации :
Цитата:
Сообщение от SHiSHok Посмотреть сообщение
X++:
        // Header markups
        // SHiSHok.FRA_Optimize -->
        factureJour.clear();
        while select forceselectorder forcenestedloop forceplaceholders RecId from markupTrans
            join RecId from factureTrans
            join * from factureJour index CustVendModuleIdx
            where
                  markupTrans.TransTableId           == this.TableId                    &&
                  markupTrans.TransRecId             == this.RecId                      &&
                  factureTrans.FactureLineType       == FactureLineType_RU::Markup      &&
                  factureTrans.MarkupRefRecId        == markupTrans.RecId               &&
                  factureJour.FactureId              == factureTrans.FactureId          &&
                  factureJour.Module                 == factureTrans.Module             &&
                  factureJour.Module                 == module                          &&
                  factureJour.CustVendInvoiceAccount == this.InvoiceAccount
        {
            if ( ! ret.find(factureJour))
            {
                ret.ins(factureJour);
            }
        }
        // SHiSHok.FRA_Optimize <--
появляется строка :
X++:
join * from factureJour index CustVendModuleIdx
Индекса CustVendModuleIdx - нет в стандарте, судя по наименованию, содержит пару полей (CustVendInvoiceAccount, Module). Так вот, если, склеивать таблицы строго в порядке MarkupTrans, FactureTrans, FactureJour, то его использование мне кажется бесполезным(смысл сортировки по двум указанным полям не понятен, поскольку для всех отобранных строк эти значения одинаковы). Если же порядок не указывать, то вполне вероятно, что использование данного индекса может дать прирост производительности, но это уже, нужно проверять на реальных данных.
__________________
Sergey Nefedov