Цитата:Примерно так:
К сожалению так плохо работает, время отработки разных вариантов запроса я уже приводил. Дело в том, что при данном варианте (видимо) перестает использоваться индекс и SQL сваливается в Скан.
Теперь почему у меня есть эта строка: "and S.Date<'99990101'" - дело в том, что когда я резал эту базу, типа delete from Sales where date<'Нужная дата' запрос отрабатывался оч-ч-чень долго, после анализа пришли к выводу, что SQL не мог определить - есть ли нужные данные только в выбранном диапазоне и сканировал все записи, после явного указания второй границы, пусть и в идиотских размерах (S.Date>'00010101') но запрос существенно ускорился, с тех пор, просто по привычке, пишу именно так.
Окончательный вариант запросов выглядит так:
Состояние("Копируем остатки");
ТекстЗапроса="select Article as ИДД, Sum(Quantity) as Количество, 0 as Приход into #tmp from remains (nolock)
| where Date>='"+Дата2+"' and division="+КодМагазина+" and Firm='"+Фирма+"' and Article not in
| (select Article from Sales (nolock) where Date<='"+Дата2+"' and Date>='"+Дата1+"'
| and Firm='"+Фирма+"' and division="+КодМагазина+" and Outgo=1) group by Article";
РС.ВыполнитьСкалярный(ТекстЗапроса);
// Добавляем в эту таблицу Движения За период с конечной даты отчета по текущую дату
Состояние("Обновляем их новыми данными");
ТекстЗапроса = "Update #tmp set Количество=Количество+S1.Bonus
| from (Select Article, Sum(case outgo when 0 then 0-Quantity when 1 then Quantity end) as Bonus
| from sales (nolock) where Date>'"+Дата2+"' and Date<'99990101' and division = "+КодМагазина+"
| and Firm='"+Фирма+"' group by Article) S1
| where #tmp.ИДД=S1.Article";
РС.ВыполнитьСкалярный(ТекстЗапроса);
Состояние("Создаем промежуточную таблицу");
ТекстЗапроса = "select DISTINCT Article into #tm1 from Sales (nolock) where Date<='"+Дата2+"' and Date>='"+Дата1+"'
| and Firm='"+Фирма+"' and division="+КодМагазина+" and Outgo=1 UNION select ИДД as Article from #tmp";
РС.ВыполнитьСкалярный(ТекстЗапроса);
ТекстЗапроса = "insert into #tmp select S.Article as ИДД,
| Sum(case S.outgo when 0 then 0-S.Quantity when 1 then S.Quantity end) as Количество, 0 as Приход
| from sales S (nolock) where Date>'"+Дата2+"' and Date<'99990101' and division = "+КодМагазина+"
| and Firm='"+Фирма+"' and Article not in
| (select Article from #tm1 (nolock)) group by S.Article";
Состояние("Добавляем полностью проданное");
РС.ВыполнитьСкалярный(ТекстЗапроса);
//Фиксируем поступление за рассматриваемый период
ТекстЗапроса = "Update #tmp set Приход=Приход+S1.Bonus
| from (select Article, Sum(Quantity) Bonus from Sales (nolock) where Date<='"+Дата2+"' and Date>='"+Дата1+"'
| and division="+КодМагазина+" and Firm='"+Фирма+"' and Outgo=0 group by Article) S1
| where #tmp.ИДД=S1.Article";
Состояние("Фиксируем поступление за период");
РС.ВыполнитьСкалярный(ТекстЗапроса);
// Выводим содержимое этой таблицы, за исключением строк с нулевым остатком,
// и строк, у которых остаток равен сумме прихода за рассматриваемый период
// так как это значит, что на начало запроса этого товара не было
ТекстЗапроса="select A.Name as Товар, A.Code as Код, R.ИДД as ИДД, R.Количество as Остаток
| from #tmp R (nolock) left join Articles A (nolock) on A.Article=R.ИДД where R.Количество<>0 and
| R.Количество<>(R.Приход)";
Состояние("Получаем товары без движения");
РС.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ,1);
З.Ы. Все таки Астор, хоть и попа, но при грамотном использовании и он способен на чЮдеса