|
v7: Помогите с запросом по остаткам (v7.7) | ☑ | ||
---|---|---|---|---|
0
zenon46
15.11.19
✎
16:06
|
Доброго дня!
Помогите с запросом, для получения остатков на каждый день. Есть интервал нужно получить остаток на каждый день этого интервала. "Черный" запрос работает очень долго, пытался прямым но, не получается сделать такой что бы он выводил по каждому дню, выводит только те дни в которых было движение. |SELECT | Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура], | Рег.КоличествоПриход-Рег.КоличествоРасход as Оборот, | Рег.Период Период |FROM | $РегистрОстаткиОбороты.ОстаткиТМЦ(:НачДата,:КонДата~,День,,,((Фирма = :ВбрФирма)),(Номенклатура),(Количество)) as Рег |"; Или киньте примером, все перерыл во всех темах сплошной троллинг |
|||
1
zenon46
15.11.19
✎
16:07
|
PS черный запрос, рабоатет долго, ну это и так понятно.
|
|||
2
Холст
15.11.19
✎
16:28
|
Запрос и будет выдавать только по тем дням, где были движения
Если нужно по дням где не было движений, то нужно слинковать с доп таблицей где будут все даты периода и как-то выдавать остатки по дню когда былли последние движения |
|||
3
BlackMor
15.11.19
✎
16:30
|
Какая конфигурация ??
|
|||
4
zenon46
15.11.19
✎
16:31
|
(2) я это понимаю, потому и прошу помощи, что у меня такое же решение "как-то выдавать остатки"
|
|||
5
zenon46
15.11.19
✎
16:31
|
(3) 7.7 Комплексная
|
|||
6
Холст
15.11.19
✎
16:35
|
(4) а в чем принципиальная сложность ?
соединяй табл дней и остатков по условию и выводи запрос конечно муторный будет |
|||
7
Холст
15.11.19
✎
16:38
|
(0) вот смотри как морочились на эту тему в 8ке, может схема запроса подойдет, хотя там конкретные дни написали
|
|||
8
Холст
15.11.19
✎
16:38
|
||||
9
BlackMor
15.11.19
✎
16:41
|
(5) В Комплексной 7.7 (АТС) ведется двойной учет - по Регистрам и по Бух. Счетам.
Если расхождения по Управленческому Учету и по Бух Учету нет, то можно попробовать сделать Запрос по Бух Данным: Ит = СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,, 1); Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, "41.1",,, 1, "День", "СК"); Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура); Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл Ит.ВыбратьПериоды(); Пока Ит.ПолучитьПериод() = 1 Цикл ОстатокКол=Ит.СНД("К")-Ит.СКД("К"); ОстатокСум=Ит.СНД("С")-Ит.СКД("С"); КонецЦикла; КонецЦикла; |
|||
10
BlackMor
15.11.19
✎
16:42
|
(9) Точнее так:
ОстатокКол=Ит.СНД("К")-Ит.СНК("К"); ОстатокСум=Ит.СНД("С")-Ит.СНК("С"); |
|||
11
Холст
15.11.19
✎
16:43
|
(9) можно подумать бухитоги выдадут по дням где не было движений
|
|||
12
zenon46
15.11.19
✎
16:43
|
(9) сдается мне это будет не быстрей черного запроса к регистру
|
|||
13
BlackMor
15.11.19
✎
16:45
|
(12) Нужно проверить, но то что будет по каждому дню даже если не было движений, это 100% так.
|
|||
14
BlackMor
15.11.19
✎
16:52
|
(12) Можно еще решить проблему вывода остатков когда не было движений так:
1. Сохранить результат в Таблицу со столбцами Дата, Остаток. 2. Потом при выводе на бумагу или в другую Таблицу анализировать, что дата пропущена и выводить последнее известное значение с движением. Т.е. остатки за пропущенные дни не менялись. |
|||
15
GreyK
15.11.19
✎
16:56
|
(0) "не получается сделать такой что бы он выводил по каждому дню, выводит только те дни в которых было движение" - "все ВошедшиеВЗапрос" тебе в помощь.
|
|||
16
Ёпрст
15.11.19
✎
16:58
|
(0)
http://www.1cpp.ru/forum/YaBB.pl?num=1296209308/0 можно и через оконные функции написать, можно и через функцию... на 1cpp все варианты были рассмотрены, да и на мисте тоже, ищи |
|||
17
zenon46
15.11.19
✎
16:59
|
(16) оконные не подходят SQL 2000
|
|||
18
Ёпрст
15.11.19
✎
17:00
|
||||
19
zenon46
15.11.19
✎
17:00
|
Нашел такой варик) попробовал, ошибка "Недопустимое имя столбца "Номенклатура". Как понят где, вроде все совподает со структурой регистра
|declare @@curDate datetime |declare @@endDate datetime | |set @@curDate = cast('"+НачДатаПрод+"' AS datetime) |set @@endDate = cast('"+КонДатаПрод+"' AS datetime) | |set nocount on | | |while @@curDate<=cast('"+КонДатаПрод+"' AS datetime) |begin | insert into #DateTable(Товар,ОстатокТовара,Расход,Дата) | SELECT | Рег.Номенклатура [Товар], | SUM(Рег.Количество) [ОстатокТовара], | SUM(Рег.Расход) [ОстатокТовара], | @@curDate [Дата] | FROM | ( | SELECT | $rg.Номенклатура [Товар], | $rg.Количество [ОстатокТовара], | 0 [Расход] | FROM | $РегистрИтоги.ОстаткиТМЦ AS rg (nolock) | WHERE | rg.period = dateadd(m,-1,dateadd(dd,-day(@@curDate)+1,@@curDate)) |AND $rg.Номенклатура IN (SELECT val FROM #TempTable) | UNION ALL | SELECT | $ra.Номенклатура [Товар], | $ra.Количество*(1-ra.debkred*2) [ОстатокТовара], | 0 [Расход] | FROM | $Регистр.ОстаткиТМЦ ra (nolock) | INNER JOIN | _1sjourn j (nolock) on j.iddoc = ra.iddoc | WHERE | cast(left(j.date_time_iddoc,8) AS datetime) between dateadd(dd,-day(@@curDate)+1,@@curDate) AND @@curDate |AND $ra.Номенклатура IN (SELECT val FROM #TempTable) | UNION ALL | SELECT | $ra2.Номенклатура [Товар], | 0 [ОстатокТовара], | $ra2.Количество*ra2.DEBKRED [Расход] | FROM | $Регистр.ОстаткиТМЦ ra2 (nolock) | INNER JOIN | _1sjourn j (nolock) on j.iddoc = ra2.iddoc | WHERE | cast(left(j.date_time_iddoc,8) AS datetime) = @@curDate |AND $ra2.Номенклатура IN (SELECT val FROM #TempTable) | UNION ALL | | SELECT | $ra3.Номенклатура [Товар], | 0 [ОстатокТовара], | 0 [Расход] | FROM | $Регистр.ОстаткиТМЦ ra3 (nolock) | INNER JOIN | _1sjourn j (nolock) on j.iddoc = ra3.iddoc | WHERE | cast(left(j.date_time_iddoc,8) AS datetime) between @@curDate AND @@endDate |AND $ra3.Номенклатура IN (SELECT val FROM #TempTable) | ) Рег | GROUP BY | Рег.Номенклатура | set @@curDate = dateadd(dd,1,@@curDate) | end |"; |
|||
20
Ёпрст
15.11.19
✎
17:05
|
||||
21
Ёпрст
15.11.19
✎
17:05
|
(19) а у тя, в юнионе нужно выкинуть псевдонимы
|
|||
22
Ёпрст
15.11.19
✎
17:06
|
оствив их только в первом запросе
|
|||
23
Ёпрст
15.11.19
✎
17:08
|
Ну и по-уму, нужно воткнуть галку быстрая обработка движений или отбор на измерении и выкинуть из текста запроса соединение с журнало, за ненадобностью
|
|||
24
zenon46
15.11.19
✎
17:08
|
(23) да, хотя бы так запустится бы
|
|||
25
zenon46
15.11.19
✎
17:15
|
(20) не запускается "Недопустимое имя объекта "#DateTable""
|
|||
26
Ёпрст
15.11.19
✎
18:20
|
(25) покажи текст запроса, нам отсюда не видно
|
|||
27
Ёпрст
15.11.19
✎
18:21
|
если тот, что в (19) там да, надо в начале временную #DateTable создать
|
|||
28
zenon46
16.11.19
✎
11:21
|
Почему не работает? Выдает ошибку Недопустимое имя столбца "Номенклатура".
|declare @@curDate datetime |declare @@endDate datetime | |set @@curDate = cast('"+НачДатаПрод+"' AS datetime) |set @@endDate = cast('"+КонДатаПрод+"' AS datetime) | |set nocount on | |while @@curDate<=cast('"+КонДатаПрод+"' AS datetime) |begin | create table #DateTable(Номенклатура Char(9), Количество Numeric(12,2), Расход Numeric(12,2), Дата datetime) | insert into #DateTable(Номенклатура,Количество,Расход,Дата) | SELECT | Рег.Номенклатура [Номенклатура], | SUM(Рег.Количество) [Количество], | SUM(Рег.Расход) [Количество], | @@curDate [Дата] | FROM | ( | SELECT | $rg.Номенклатура [Номенклатура], | $rg.Количество [Количество], | 0 [Расход] | FROM | $РегистрИтоги.ОстаткиТМЦ AS rg (nolock) | WHERE | rg.period = dateadd(m,-1,dateadd(dd,-day(@@curDate)+1,@@curDate)) |AND $rg.Номенклатура IN (SELECT val FROM #TempTable) | UNION ALL | SELECT | $ra.Номенклатура [Номенклатура], | $ra.Количество*(1-ra.debkred*2) [Количество], | 0 [Расход] | FROM | $Регистр.ОстаткиТМЦ ra (nolock) | INNER JOIN | _1sjourn j (nolock) on j.iddoc = ra.iddoc | WHERE | cast(left(j.date_time_iddoc,8) AS datetime) between dateadd(dd,-day(@@curDate)+1,@@curDate) AND @@curDate |AND $ra.Номенклатура IN (SELECT val FROM #TempTable) | UNION ALL | SELECT | $ra2.Номенклатура [Номенклатура], | 0 [Количество], | $ra2.Количество*ra2.DEBKRED [Расход] | FROM | $Регистр.ОстаткиТМЦ ra2 (nolock) | INNER JOIN | _1sjourn j (nolock) on j.iddoc = ra2.iddoc | WHERE | cast(left(j.date_time_iddoc,8) AS datetime) = @@curDate |AND $ra2.Номенклатура IN (SELECT val FROM #TempTable) | UNION ALL | SELECT | $ra3.Номенклатура [Номенклатура], | 0 [Количество], | 0 [Расход] | FROM | $Регистр.ОстаткиТМЦ ra3 (nolock) | INNER JOIN | _1sjourn j (nolock) on j.iddoc = ra3.iddoc | WHERE | cast(left(j.date_time_iddoc,8) AS datetime) between @@curDate AND @@endDate |AND $ra3.Номенклатура IN (SELECT val FROM #TempTable) | ) Рег | GROUP BY | Рег.Номенклатура | set @@curDate = dateadd(dd,1,@@curDate) | end |
|||
29
ДенисЧ
16.11.19
✎
11:25
|
Для INSERT INTO не надо заранее создавать таблицу
|
|||
30
zenon46
16.11.19
✎
11:26
|
(29) да, это я та ксказать пробовал варианты. Ибо ошибка сохраняется эта же.
|
|||
31
ДенисЧ
16.11.19
✎
11:30
|
(30) попробуй
insert into #DateTable([Номенклатура},[Количество],[Расход],[Дата]) |
|||
32
zenon46
16.11.19
✎
11:31
|
(31) Недопустимое имя столбца "Номенклатура".
|
|||
33
zenon46
16.11.19
✎
16:46
|
|CREATE TABLE [#DateTable] (
|[Номенклатура ] [char] (9) NOT NULL , |[Количество ] [numeric](5, 0) NOT NULL , |[Расход ] [numeric](5, 0) NOT NULL , |[Дата ] [datetime] NOT NULL |) ON [PRIMARY] И так не работает |
|||
34
zenon46
16.11.19
✎
17:04
|
Запустился вот так "insert into DateTable([Номенклатура},[Количество],[Расход],[Дата])" без # перед именем таблицы. Результат что-то не впечатлил, работает ОЧЕНЬ долго.
|
|||
35
zenon46
16.11.19
✎
17:20
|
И на выходе пустой.
|
|||
36
Djelf
16.11.19
✎
17:26
|
(34) А ты как сам то думаешь, во это
cast(left(j.date_time_iddoc,8) AS datetime) between dateadd(dd,-day(@@curDate)+1,@@curDate) AND @@curDate может попасть в индекс? Должно быть "сырое" чтение всей таблицы _1sjourn. |
|||
37
Djelf
16.11.19
✎
17:33
|
(36)+ Должно быть как то вот так
j.date_time_iddoc between @@curDate||' 6+9пробелов' AND @@curDate||' 6+9 символов я' |
|||
38
Ёпрст
16.11.19
✎
20:10
|
Ну, я бы вообще так не делал, гораздо проще получить остаток на начало, кросс джоин с табличкой дат и дальше проссумировать с движениями за период.. усё, а не вычислять остаток на каждую дату в цикле
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |