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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.09.2009, 21:26   #1  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 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
Теги
axapta, faq, запрос (query), производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Производство. Запросы\Развертывание\Обработка не дает нужный результат e@gle DAX: Функционал 11 11.05.2007 18:10
Сложные запросы в RLS Ruff DAX: Администрирование 12 30.08.2005 18:02
Запросы в Аксапта ibc DAX: Программирование 5 08.08.2005 22:47
Разные запросы в 2-х и 3-х уровневой конфигурациях. Что делать?! Anais DAX: Программирование 12 04.11.2004 12:47
Сложные while select-запросы или вложенные циклы Atani DAX: Программирование 10 03.02.2004 13:46
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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