|
v7: 1c++: получить за период обороты по реквизитам регистра с группировкой по дням | ☑ | ||
---|---|---|---|---|
0
dk
28.12.11
✎
08:39
|
Исходные:
1С++, 1С 7.7 Регистр ТОварыНАскладах 2 реквизита Оборот и Списание измерение товар Хочу получить обороты по реквизитам с группировкой по дням например товар1 - 01/01/2011 - sum(Оборот) - sum(Списание) товар1 - 01/02/2011 - sum(Оборот) - sum(Списание) товар2 - 01/01/2011 - sum(Оборот) - sum(Списание) .... Пока наваял через конструктор
но матерится qryConsole : State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Оборот'. |
|||
1
Mikeware
28.12.11
✎
08:40
|
и?
|
|||
2
dk
28.12.11
✎
08:42
|
вообще исходная задача чуть шире - надо получить средние продажи за период, т.е. определить дни присутствия / продаж товара на складе и поделить сумму продаж за период на дни присутствия. может кто уже решал подобное
|
|||
3
Гефест
28.12.11
✎
08:42
|
В ВТ вроде нет реквизитов?
|
|||
4
dk
28.12.11
✎
08:42
|
>но матерится
qryConsole : State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Оборот'. |
|||
5
dk
28.12.11
✎
08:43
|
их нет из-за группировки день?
|
|||
6
Гефест
28.12.11
✎
08:44
|
(5) Их совсем нет. Сроду не завозили
|
|||
7
dk
28.12.11
✎
08:46
|
(6) куда они из оборотов-то делись? )
|
|||
8
Гефест
28.12.11
✎
08:48
|
(7) Из оборотов никуда не девались, а в ВТ Обороты их нет
|
|||
10
dk
28.12.11
✎
08:50
|
тогда возвращаемся к теме
как получить обороты по реквизиту с группировкой по дням? |
|||
12
Mikeware
28.12.11
✎
08:51
|
(2) Я решал.
|
|||
13
Гефест
28.12.11
✎
08:52
|
(10) Запросом к реальной таблице оборотов регистра. А там уже группируй как хочешь
|
|||
14
Mikeware
28.12.11
✎
08:52
|
(10)"оборот по реквизиту" - не понял нифига
|
|||
15
dk
28.12.11
✎
08:53
|
(8) конструктор показывает, что есть реквизиты в ВТ по оборотам, врет?
|
|||
16
viktor_vv
28.12.11
✎
08:56
|
Уточню, точно имеются ввиду реквизиты, а не ресурсы ?
|
|||
17
ado
28.12.11
✎
08:59
|
(10) Может, все-таки по измерению?
|
|||
18
dk
28.12.11
✎
09:00
|
(16) реквизиты
(17) по реквизиту |
|||
19
Гефест
28.12.11
✎
09:02
|
(15) Значит врет
|
|||
20
ado
28.12.11
✎
09:04
|
(19) Да не, не врет. А вот автор врет. То что он написал конструктор выдать не мог.
|
|||
21
ado
28.12.11
✎
09:06
|
Стоп, стоп, "Оборот" и "Списани" -- это что, названия реквизитов?
|
|||
22
dk
28.12.11
✎
09:06
|
(20) я токмо суммы добавил
покажи как правильно, раз я вру |
|||
23
dk
28.12.11
✎
09:07
|
(21) да, читаем (0)
|
|||
24
ado
28.12.11
✎
09:08
|
(22) Для начала, нарисуй структуру регистра, как она есть в конфигураторе. И уточни, оборотный он, или остаточный.
|
|||
25
dk
28.12.11
✎
09:12
|
измерения:
товар склад ... ресурсы: Колво вес ... реквизиты: оборот - число списание - число регистр остатков |
|||
26
Mikeware
28.12.11
✎
09:23
|
(25) все равно я нифига не понял. что ты в них хранишь, в этих реквизитах?
|
|||
27
dk
28.12.11
✎
09:24
|
конфа такая, себестоимость и сумма продаж там.
|
|||
28
viktor_vv
28.12.11
✎
09:27
|
Как-то так.
SELECT top 100 $ТоварыПоСкладамОбороты.Товар [Товар $Справочник.Номенклатура] , Left(Ж.Date_Time_IDDOC,8) [Период $Дата] , sum($ТоварыПоСкладамОбороты.Оборот) _1 , sum($ТоварыПоСкладамОбороты.Списание) _2 FROM $Регистр.ТоварыПоСкладам AS ТоварыПоСкладамОбороты (nolock) Left join _1Sjourn as Ж (nolock) on Ж.IDDOC = ТоварыПоСкладамОбороты.IDDOC Where Ж.Date_Time_IDDOC between :НачДата and :КонДата~ Group by $ТоварыПоСкладамОбороты.Товар,Left(Ж.Date_Time_IDDOC,8) или inner join , не могу до конца понять, как лучше. Это если не стоит флаг "Быстрая обработка движений", если стоит, то журнал не нужен, Left(ТоварыПоСкладамОбороты.Date_Time_IDDOC,8) |
|||
29
dk
28.12.11
✎
09:31
|
вроде разобрался уже через простой регистр
по идее (13) |
|||
30
Mikeware
28.12.11
✎
09:38
|
NullIf(Cast(Left(ТоварыПоСкладам.DATE_TIME_IDDOC, 8) AS datetime), '17530101')
- шозабред? , min(0) - шозабред? |
|||
31
dk
28.12.11
✎
09:40
|
NullIf(Cast(Left(ТоварыПоСкладам.DATE_TIME_IDDOC, 8) AS datetime), '17530101')
хз конструктор наваял а min - это для будующего union с остатками |
|||
32
toypaul
гуру
28.12.11
✎
09:42
|
а в toysql без проблем :)
|
|||
33
Ёпрст
28.12.11
✎
09:43
|
(31) юнион в селект листе ?
ну-ну.. |
|||
34
dk
28.12.11
✎
15:46
|
а все оказалось напрасно (
долбаный 1с++ такую лажу возвращает из ВТ по остаткам на каждый день |
|||
35
Ёпрст
28.12.11
✎
15:46
|
(34) а при чем тут остатки ?
:) |
|||
36
ado
28.12.11
✎
15:53
|
(34) А ты, небось, еще и остатки по реквизитам получить хочешь? ;-)
|
|||
37
AeDen
28.12.11
✎
15:56
|
(35) + и причем тут 1С++?
|
|||
38
viktor_vv
28.12.11
✎
15:59
|
(34) А метод дополнения небось ДвиженияИГраницыПериода ?
|
|||
39
dk
28.12.11
✎
16:13
|
(35) (36) (37) Средние продажи нужны - дополнительно остатки по каждому дню считаю через
---- (38) проверял оба, оба лажу показывают |
|||
40
viktor_vv
28.12.11
✎
16:14
|
(38)+ Хотя для периодичности День метод дополнения неважен.
|
|||
41
viktor_vv
28.12.11
✎
16:15
|
В чем лада заключается ? И группировать не надо, укажи в параметрах по каким измерениям считать. ВТ вернет уже свернутую нормально.
|
|||
42
dk
28.12.11
✎
16:25
|
(41) остатки вообще неадекватные возвращает
|
|||
43
viktor_vv
28.12.11
✎
16:26
|
:КонДата~
|
|||
44
ado
28.12.11
✎
16:31
|
А что такое "ОстатокТовараКонечныйОстаток"? Я в (25) не вижу ресурса с названием ОстатокТовара
|
|||
45
viktor_vv
28.12.11
✎
16:31
|
FROM $РегистрОстаткиОбороты.ТоварыПоСкладам(:НачДата,
:КонДата~, |
|||
46
dk
28.12.11
✎
16:39
|
(45) пофигу, я же за период смотрю, а не на последнюю дату
|
|||
47
dk
28.12.11
✎
16:40
|
(44) он есть там ... )
|
|||
48
viktor_vv
28.12.11
✎
16:41
|
(46) Ну это повлияет только на последний день периода. А так не знаю, где ты смотришь адекватные остатки, у меня нормально показывает.
|
|||
49
dk
28.12.11
✎
16:54
|
сравнивал с regprint и с ВТ остатки на заданную дату
regprint и ВТ остатки показывали правильный остаток, ВТОстаткиОбороты фигню |
|||
50
viktor_vv
28.12.11
✎
17:00
|
Ну ХЗ. Сравнивал с тем же регпринтом, все нормально. Ты бы все-таки прописал измерение в параметры ВТ убрал Group by и убрал NullIf(ТовОстаткиОбороты.Период, '17530101'), оставив ТовОстаткиОбороты.Период, от греха подальше.
|
|||
51
dk
29.12.11
✎
09:40
|
если еще интересно
тек версия 1С++ 3.2.1.0 http://s017.radikal.ru/i435/1112/a0/9e3c3c0e5d00.jpg ВТ остаткиобороты без группировки - несколько записей на 1 дату http://s55.radikal.ru/i150/1112/6a/26b84c0dcd1f.jpg ВТ остаткиобороты с группировкой - обороты вроде идут, остатки левые http://s017.radikal.ru/i415/1112/1e/1a66a4f46869.jpg ВТ остатки http://i032.radikal.ru/1112/89/6fc2070d02bc.jpg regprint |
|||
52
Ёпрст
29.12.11
✎
09:42
|
(51) ёпта, перечисли наконец список нужных измерений унутри ВТ.
|
|||
53
ЧеловекДуши
29.12.11
✎
09:44
|
Вот, держи функцию... может поможет
Позволяет из строки дату получить в нужном разрезе :) //len1 - дата Строкой 8 симв (4 год + 2 мес + 2 день), len2 - параметр для результата ТекстЗапроса=" |if Object_ID('"+ФункПР+"') is null |Begin |Exec(' |create FUNCTION "+ФункПР+"( @len1 varchar(8), @len2 int) RETURNS datetime |AS |begin |declare @tval datetime; |declare @tval1 int; |declare @tval2 int; |set @tval = Cast(''17530101'' AS datetime); | |if (@len1 is null) or (LTrim(RTrim(@len1)) = '''') or (@tval >= Cast(@len1 AS datetime)) RETURN(@tval); | //1 - День |if @len2 = 1 set @tval = Cast(@len1 AS datetime); |Else |Begin // 2 - Неделя | if @len2 = 2 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(w,@tval); | set @tval = DATEADD(d,1 - @tval1,@tval); | end | else | Begin // 3 - квартал | if @len2 = 3 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(q,@tval); | set @tval2 = DatePart(yy,@tval); | if @tval1 = 1 set @tval = Cast( Str(@tval2,4,0)+''0101'' AS datetime) | else | if @tval1 = 2 set @tval = Cast( Str(@tval2,4,0)+''0401'' AS datetime) | else | if @tval1 = 3 set @tval = Cast( Str(@tval2,4,0)+''0701'' AS datetime) | else | if @tval1 = 4 set @tval = Cast( Str(@tval2,4,0)+''1001'' AS datetime); | End | else | Begin // 4 - месяц | if @len2 = 4 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(d,@tval); | set @tval = DATEADD(d,1 - @tval1,@tval); | end | else | Begin // 5 - год | if @len2 = 5 | Begin | set @tval = Cast(@len1 AS datetime); | set @tval1 = DatePart(dy,@tval); | set @tval = DATEADD(d,1 - @tval1,@tval); | End | else | set @tval = Cast(@len1 AS datetime); | End; | end; | end; |end; | |RETURN(@tval); |end |') | |select 2 as Err |end else |select 1 as Err |"; |
|||
54
Ёпрст
29.12.11
✎
09:45
|
и остатки не левые, нужно всего лишь прибавить приход-расход к предыдущему итогу.
|
|||
55
dk
29.12.11
✎
10:02
|
(52) точно, помогло, спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |