Цитата:
Сообщение от
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, то его использование мне кажется бесполезным(смысл сортировки по двум указанным полям не понятен, поскольку для всех отобранных строк эти значения одинаковы). Если же порядок не указывать, то вполне вероятно, что использование данного индекса может дать прирост производительности, но это уже, нужно проверять на реальных данных.