marvel писал(а) 11. Августа 2011 :: 10:56: |select
| p.День AS День,
| ost.Номенклатура AS[Номенклатура $Справочник.Номенклатура],
| ost.Склад AS [Склад $Справочник.Склады],
| sum(ost.КоличествоКонечныйОстаток) AS КоличествоКонОст
|from
| #tmp_dates as p
|left join
| $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНач,:ДатаКон~,ДЕНЬ,,,(Номенклатура in (Select val from #СписокНоменклатуры)),(Номенклатура,Склад),(Количество)) as ost
|on
| p.День = ost.Период
|group by ost.Номенклатура,ost.Склад,p.День
|order by ost.Номенклатура,ost.Склад,p.День
все таки выбирает остатки там где были движения.
Никто не делал по остаткам на каждый день?
по идее примерно так:
//{таблица остатки-обороты
Т = "
|set nocount on
|
|create table #ОстаткиОбороты(
| Период datetime
| , Номенклатура char(9)
| , Склад char(9)
| , Количество numeric(38,3)
| ,primary key clustered (Номенклатура, Склад, Период))
|
|insert into #ОстаткиОбороты
|select
| Период
| , Номенклатура
| , Склад
| , sum(Количество) Количество
|from (
| select
| :НачДата~~ Период
| ,Номенкладтура
| ,Склад
| ,КоличествоОстаток Количество
| from
| $РегистрОстатки.ОстаткиТМЦ(:НачДата
| ,
|
| ,(Номенклатура in (Select val from #СписокНоменклатуры))
| ,(Номенклатура,Склад)
| ,(Количество)
| ) as Итогов
|
| union all
|
| select
| Период
| ,Номенкладтура
| ,Склад
| ,КоличествоПриход-КоличествоРасход Количество
| from $РегистрОбороты.ОстаткиТМЦ(:НачДата,:КонДата~,День
| ,
|
| ,(Номенклатура in (Select val from #СписокНоменклатуры))
| ,(Номенклатура,Склад)
| ,(Количество)) as Итогов
| ) as Итогов
|
|group by
| Период
| , Номенклатура
| , Склад
|
|order by
| Номенклатура
| , Склад
| , Период
|";
глРекордСет.ВыполнитьИнструкцию(Т);
//}
//{таблица периоды
Т = "
|
|create table #Периоды (Период datetime primary key)
|";
глРекордСет.ВыполнитьИнструкцию(Т);
Т = "
|
|insert into #Периоды
|";
Для х = Дата1 По Дата2 Цикл
Т = Т + ?(х = Дата1,"","
|union all ")+ "select '"+Формат(х,"ДГГГГММДД")+"'";
КонецЦикла;
глРекордСет.ВыполнитьИнструкцию(Т);
//}
//{дополнение таблицы остатки-обороты периодами
Т = "
|
|create table #ЗапасСредний(
| Период datetime
| , Номенклатура char(9)
| , Склад char(9)
| , Количество numeric(38,3)
| ,primary key clustered (Номенклатура, Склад, Период)
|)
|
|insert into #ЗапасСредний
|select
| crosstable.Период
| ,crosstable.Номенклатура,crosstable.Склад
| , isnull(vt_totalreg.Количество,0) Количество
|from
| (select Период Период
| ,vt_def.Номенклатура,vt_def.Склад
| from #Периоды as datetable
| cross join (select distinct Номенклатура,Склад from #ОстаткиОбороты) as vt_def
| ) as crosstable
|left join #ОстаткиОбороты as vt_totalreg
| on crosstable.Период = vt_totalreg.Период
| and crosstable.Номенклатура = vt_totalreg.Номенклатура
| and crosstable.Склад = vt_totalreg.Склад
|
|drop table #ОстаткиОбороты
|drop table #Периоды
|";
глРекордСет.ВыполнитьИнструкцию(Т);
//}
//{получение остатка на каждый период
Т = "
|declare @Номенклатура char(9)
|declare @Склад char(9)
|
|declare @Количество numeric(38,3)
|
|update #ЗапасСредний
|set
| @Количество = Количество = case when @Номенклатура = Номенклатура and @Склад = Склад then @Количество + Количество else Количество end
| ,@Номенклатура = Номенклатура
| ,@Склад = Склад
|
|";
глРекордСет.ВыполнитьИнструкцию(Т);
глРекордСет.ВыполнитьИнструкцию("select * trom #ЗапасСредний");