Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Девелоперам: Группировка Период в ВТ (число прочтений - 3525 )
Vaicartana
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 50
Местоположение: Far, Far Away...
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Девелоперам: Группировка Период в ВТ
01. Апреля 2007 :: 06:42
Печать  
Господа разработчики! А кто собственно в ответе за запрос с группировкой Период: День/неделя/Месяц/Квартал/Год?

есть несколько вопросов:

1. Почему на нем не работает метод отладка(1)? Точнее работает, но выдает линейный запрос к временной таблице. Приходится профайлером запросы вылавливать.
2. разбор полетов(профалера) показал, что сам запрос монстрообразное безобразие не входящее в строку 1С, причем его можно было описать гораздо проще.
3. Почему запрос формирует временную таблицу, да еще и в два этапа?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #1 - 04. Апреля 2007 :: 15:12
Печать  
Больше не разрабатываю, но отвечу.
Судя по всему речь идет о ВТ РегистрОстаткиОбороты с периодичностью
1. Так сделано, потому что запросов там получается много, применяются параметризированные запросы. Реализация этой таблицы сильно отличается от остальных, т.о. просто приведено к общему поведению.
2. Я не вижу способа получить данные проще.
3. Получаются остатки, обороты, по данным результатов запросов формируется временная таблица с расчетом текущих остатков по периоду.

Эта ВТ (когда она с периодичностью) может формировать неправильные результаты!
Вместо нее рекомендую использовать объединение ВТ РегистрОстатки и РегистрОбороты и текущий остаток по периоду считать на клиенте.
  
Наверх
ICQ  
IP записан
 
Vaicartana
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 50
Местоположение: Far, Far Away...
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #2 - 05. Апреля 2007 :: 14:59
Печать  
1+2 потому и спросил, что сделав анализ пришел к выводу, что запрос не оптимальный.

А нельзя ли немного по подробнее, что за неправильные резульаты и когда они появляются. А то может и в моем запросе закрался червячек, да я не заметил...
  
Наверх
 
IP записан
 
Vaicartana
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 50
Местоположение: Far, Far Away...
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #3 - 19. Апреля 2007 :: 04:31
Печать  
в общем в статье о прямых запросах я этот момент для ДБФ переписал привожу кусок статьи с корректировкой для СКЛ

Сначала сделаем простой запрос с группировкой день
|SELECT
|      Рег.Товар as [Товар $Справочник.Номенклатура],
|      Рег.Период Период,
|      SUM(Рег.Количество) as Количество
|FROM
|      (SELECT
|            $Р.Номенклатура as Товар,
|            $Р.Количество as Количество,
|            CAST(LEFT(jr.date_time_iddoc,8) as datetime) AS Период
|      FROM $Регистр.ОстаткиТоваров as Р
|      INNER JOIN
|            1sjourn jr ON (Р.iddoc = jr.iddoc)
|                        And (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
|      WHERE
|            AND ($ФлагРегистра. ОстаткиТоваров = 1)
|      ) as Рег
|GROUP BY
|      Рег.Товар,
|      Рег.Период

Теперь сделаем запрос с группировкой неделя.
|SELECT
|      Рег.Товар as [Товар $Справочник.Номенклатура],
|      Рег.Период Период,
|      SUM(Рег.Количество) as Количество
|FROM
|      (SELECT
|            Рег.Товар,
|            CASE WHEN Рег.Период - datepart(dw,Рег.Период)<:НачДата~~ THEN
|                  :НачДата~~
|            ELSE
|                  Рег.Период - datepart(dw,Рег.Период)
|            END AS Период
|      FROM
|            (SELECT
|                  $Р.Номенклатура as Товар,
|                  $Р.Количество as Количество,
|                  CAST(LEFT(jr.date_time_iddoc,8) as datetime) AS Период
|            FROM $Регистр.ОстаткиТоваров as Р
|            INNER JOIN
|                  1sjourn jr ON (Р.iddoc = jr.iddoc)
|                        And (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
|            WHERE
|                  AND ($ФлагРегистра. ОстаткиТоваров = 1)
|            ) as Рег
|      ) as Рег
|GROUP BY
|      Рег.Товар,
|      Рег.Период


Теперь посмотрим на запрос с группировкой Месяц
|SELECT
|      Рег.Товар as [Товар $Справочник.Номенклатура],
|      Рег.Период Период,
|      SUM(Рег.Количество) as Количество
|FROM
|      (SELECT
|            Рег.Товар,
|            CASE WHEN      Рег.Период < :НачДата~~ THEN
|                  НачДата~~
|            ELSE
|                  Рег.Период
|            END AS Период
|      FROM
|            (SELECT
|                  $Р.Номенклатура as Товар,
|                  $Р.Количество as Количество,
|                  CAST(LEFT(jr.date_time_iddoc,4)+RIGHT(LEFT(jr.date_time_iddoc,6),2)+'01' as datetime) AS Период
|            FROM $Регистр.ОстаткиТоваров as Р
|            INNER JOIN
|                  1sjourn jr ON (Р.iddoc = jr.iddoc)
|                        And (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
|            WHERE
|                  AND ($ФлагРегистра. ОстаткиТоваров = 1)
|            ) as Рег
|      ) as Рег
|GROUP BY
|      Рег.Товар,
|      Рег.Период

группировка Квартал.
|SELECT
|      Рег.Товар as [Товар $Справочник.Номенклатура],
|      Рег.Период Период,
|      SUM(Рег.Количество) as Количество
|FROM
|      (SELECT
|            Рег.Товар,
|            CASE WHEN      Рег.Период < :НачДата~~ THEN
|                  НачДата~~
|            ELSE
|                  Рег.Период
|            END AS Период
|      FROM
|            (SELECT
|                  $Р.Номенклатура as Товар,
|                  $Р.Количество as Количество,
|                  CAST(LEFT(jr.date_time_iddoc,4)+
|                        CASE WHEN RIGHT(LEFT(jr.date_time_iddoc,6),2)<'4' THEN '01'
|                              ELSE
|                              CASE WHEN RIGHT(LEFT(jr.date_time_iddoc,6),2)<'7' THEN  '04'
|                                    ELSE
|                                    CASE WHEN RIGHT(LEFT(jr.date_time_iddoc,6),2)<'10' THEN '07'
|                                          ELSE '10'
|                                    END
|                              END
|                        END+'01' as datetime) AS Период
|            FROM $Регистр.ОстаткиТоваров as Р
|            INNER JOIN
|                  1sjourn jr ON (Р.iddoc = jr.iddoc)
|                        And (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
|            WHERE
|                  AND ($ФлагРегистра. ОстаткиТоваров = 1)
|            ) as Рег
|      ) as Рег
|GROUP BY
|      Рег.Товар,
|      Рег.Период

группировка - Год
|SELECT
|      Рег.Товар as [Товар $Справочник.Номенклатура],
|      Рег.Период Период,
|      SUM(Рег.Количество) as Количество
|FROM
|      (SELECT
|            Рег.Товар,
|            CASE WHEN      Рег.Период < :НачДата~~ THEN
|                  НачДата~~
|            ELSE
|                  Рег.Период
|            END AS Период
|      FROM
|            (SELECT
|                  $Р.Номенклатура as Товар,
|                  $Р.Количество as Количество,
|                  CAST(LEFT(jr.date_time_iddoc,4)+'0101' as datetime) AS Период
|            FROM $Регистр.ОстаткиТоваров as Р
|            INNER JOIN
|                  1sjourn jr ON (Р.iddoc = jr.iddoc)
|                        And (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
|            WHERE
|                  AND ($ФлагРегистра. ОстаткиТоваров = 1)
|            ) as Рег
|      ) as Рег
|GROUP BY
|      Рег.Товар,
|      Рег.Период

В итоге у меня получился универсальный код, работающий как на СКЛ так и на ДБФ платформах.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #4 - 19. Апреля 2007 :: 05:58
Печать  
1)Речь ведь шла о ВТ РегистрОстаткиОбороты с периодичностью.. Приведенные запросы не решают задачи этой ВТ.
результат должен быть примерно таким:
Товар,
Период,
КоличествоНачальныйОстаток,
КоличествоПриход,
КоличествоРасход,
КоличествоКонечныйОстаток

2)Приведенные запросы вообще возвращают чепуху, т.к. суммируют все в кучу, приход и расход (не учитывают debkred), да и в них просто есть ошибки (не выполнятся вообще)

3)Запросы вообще не считают остатки. Возможно на самом деле изначально задача стояла посчитать именно обороты, тогда рекомендую воспользоваться ВТ РегистрОбороты с указанием периодичности, в ней нет обозначенной в самом начале проблемы, и она работает действительно правильно в отличие от твоих запросов.

4)"универсальный код", пошутил опять Улыбка
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #5 - 19. Апреля 2007 :: 06:20
Печать  
не понял - это для dbf или sql ?
присутствие jr.date_time_iddoc и jr.date меня вводят в ступор
  

1&&2&&3
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #6 - 19. Апреля 2007 :: 06:26
Печать  
да запросы воопще, рвут моск нипадецки

Vaicartana, твое стремление создать и сопровождать статью по прямым запросам замечательно, и достойно уважения (в отличие от остальных пользователей-нытиков: "..все непонятно, и почему нет хорошей доки-учебника..", ты хотябы что-то делаешь, и местами весьма неплохо), но ты бы как-нибудь аккуратнее, тебя ведь люди читают, потом вопросы задают..
  
Наверх
ICQ  
IP записан
 
Vaicartana
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 50
Местоположение: Far, Far Away...
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: Девелоперам: Группировка Период в ВТ
Ответ #7 - 25. Апреля 2007 :: 09:08
Печать  
"не надо было понимать это буквально... Ну эта истогия пго Адама и Еву - пгосто кгасивая истогия и больше ничего" (с) х/ф Snatch

Народ, вы чего? Это пример условия, а никак не готовая ВТ!
Чтобы получить
Цитата:
КоличествоНачальныйОстаток,
КоличествоПриход,
КоличествоРасход,
КоличествоКонечныйОстаток

достаточно ввести соответствующие запросы к таблице остатков.

Насчет jr.date_time_iddoc и jr.date  - ну ошибся, бывает.
1sjournl тоже надо было с "_" писать.

Еще раз говорю: подобный запрос у меня работает причем на разных базах: на ДБФ и на СКЛ. Ну, погорячился, каюсь, резал топором из работающего запроса, переделывал на лету, что то не досмотрел.
Я ж собственно и ветку завел из-за непонятности в работе ВТ, может можно что то сделать с этой таблицей, ведь запрос в ней очень уж странный получается...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать