Имя: Пароль:
1C
1C 7.7
v7: Отчет с "неопределенными" группировками в прямых запросах
0 AMKahm
 
16.08.11
14:35
Пролемма такая есть...
Запрос идет по периодам... по регистру Продажи...
отчетик написать надо где группировки можно вручную выбирать:
т.е.:
Хочу выбиру из Списка: Фирма-Склад-Покупатель-Номенклатура-Партия
или Поставщик-Номенклатура или Фирма-Номенклатура-Покупатель

если писать 7-шным "языком" запросов то понятно сделал

|Группировка Фирма;
|Группировка Номенклатура;
|Группировка Покупатель;

- и профит...

тока за 3 месяца запрос формируется аж минут 10... что совсем плохо...

хочется написать это чудо на 1С++ прямых запросах...
вопрос тока как?

Следующая хрень выдаст примерно тоже, что и Запрос стандартными средствами по номенклатуре:

       |SELECT  DISTINCT
       |     TabSpr.id [Номенклатура $Справочник.Номенклатура]
       |    , CASE WHEN (TabSpr.IsFolder = 1) THEN '_______________'+TabSpr.DESCR
       |        ELSE TabSpr.DESCR
       |      END As Наименование
       |    , TabSpr.IsFolder As ЭтоГруппа
       |    , $TabSpr.Артикул As Артикул
       |    ,CASE WHEN TabSprGr4.DESCR IS NOT NULL THEN 5
       |        ELSE
       |        CASE WHEN TabSprGr3.DESCR IS NOT NULL THEN 4
       |            ELSE
       |            CASE WHEN TabSprGr2.DESCR IS NOT NULL THEN 3
       |                ELSE
       |                 CASE WHEN TabSprGr1.DESCR IS NOT NULL THEN 2
       |                     ELSE 1
       |                 END
       |            END
       |        END
       |    END As Уровень,
       |    CASE WHEN TabSprGr4.DESCR IS NOT NULL THEN TabSprGr4.id
       |        ELSE
       |        CASE WHEN TabSprGr3.DESCR IS NOT NULL THEN TabSprGr3.id  
       |            ELSE
       |            CASE WHEN TabSprGr2.DESCR IS NOT NULL THEN TabSprGr2.id
       |                ELSE
       |                   CASE WHEN TabSprGr1.DESCR IS NOT NULL THEN TabSprGr1.id
       |                     ELSE  
       |                     CASE WHEN (TabSpr.IsFolder = 1) THEN TabSpr.id
       |                     END
       |                 END
       |            END
       |        END
       |    END [гр1с $Справочник.Номенклатура],
       |   CASE WHEN (TabSprGr3.DESCR IS NOT NULL)
       |          AND (TabSprGr4.DESCR IS NOT NULL) THEN TabSprGr3.id
       |        ELSE
       |        CASE WHEN (TabSprGr2.DESCR IS NOT NULL)
       |                AND (TabSprGr3.DESCR IS NOT NULL) THEN TabSprGr2.id
       |            ELSE
       |            CASE WHEN (TabSprGr1.DESCR IS NOT NULL)
       |                      AND (TabSprGr2.DESCR IS NOT NULL) THEN TabSprGr1.id
       |                  ELSE
       |                  CASE WHEN (TabSprGr1.DESCR IS NOT NULL) AND (TabSpr.IsFolder = 1) THEN TabSpr.id
       |                  END
       |           END
       |       END
       |    END [гр2с $Справочник.Номенклатура],
       |    CASE WHEN (TabSprGr2.DESCR IS NOT NULL)
       |          AND (TabSprGr3.DESCR IS NOT NULL)
       |          AND (TabSprGr4.DESCR IS NOT NULL) THEN TabSprGr2.id
       |        ELSE
       |        CASE WHEN (TabSprGr1.DESCR IS NOT NULL)
       |                AND (TabSprGr2.DESCR IS NOT NULL)
       |                AND (TabSprGr3.DESCR IS NOT NULL) THEN TabSprGr1.id
       |             ELSE
       |             CASE WHEN (TabSprGr1.DESCR IS NOT NULL) AND (TabSprGr2.DESCR IS NOT NULL) AND (TabSpr.IsFolder = 1) THEN TabSpr.id
       |             END
       |       END
       |    END [гр3с $Справочник.Номенклатура],
       |   CASE WHEN (TabSprGr1.DESCR IS NOT NULL)
       |          AND (TabSprGr2.DESCR IS NOT NULL)
       |          AND (TabSprGr3.DESCR IS NOT NULL)
       |          AND (TabSprGr4.DESCR IS NOT NULL) THEN TabSprGr1.id
       |         ELSE
       |         CASE WHEN (TabSprGr1.DESCR IS NOT NULL) AND (TabSprGr2.DESCR IS NOT NULL) AND (TabSprGr3.DESCR IS NOT NULL) AND (TabSpr.IsFolder = 1) THEN TabSpr.id
       |         END
       |    END [гр4с $Справочник.Номенклатура],
       |    CASE WHEN TabSprGr4.DESCR IS NOT NULL THEN TabSprGr4.DESCR
       |        ELSE
       |        CASE WHEN TabSprGr3.DESCR IS NOT NULL THEN TabSprGr3.DESCR  
       |            ELSE
       |            CASE WHEN TabSprGr2.DESCR IS NOT NULL THEN TabSprGr2.DESCR
       |                ELSE
       |                   CASE WHEN TabSprGr1.DESCR IS NOT NULL THEN TabSprGr1.DESCR
       |                     ELSE  
       |                     CASE WHEN (TabSpr.IsFolder = 1) THEN TabSpr.DESCR
       |                     END
       |                 END
       |            END
       |        END
       |    END гр1,
       |   CASE WHEN (TabSprGr3.DESCR IS NOT NULL)
       |          AND (TabSprGr4.DESCR IS NOT NULL) THEN TabSprGr3.DESCR
       |        ELSE
       |        CASE WHEN (TabSprGr2.DESCR IS NOT NULL)
       |                AND (TabSprGr3.DESCR IS NOT NULL) THEN TabSprGr2.DESCR
       |            ELSE
       |            CASE WHEN (TabSprGr1.DESCR IS NOT NULL)
       |                      AND (TabSprGr2.DESCR IS NOT NULL) THEN TabSprGr1.DESCR
       |                  ELSE
       |                  CASE WHEN (TabSprGr1.DESCR IS NOT NULL) AND (TabSpr.IsFolder = 1) THEN TabSpr.DESCR
       |                  END
       |           END
       |       END
       |    END гр2,
       |    CASE WHEN (TabSprGr2.DESCR IS NOT NULL)
       |          AND (TabSprGr3.DESCR IS NOT NULL)
       |          AND (TabSprGr4.DESCR IS NOT NULL) THEN TabSprGr2.DESCR
       |        ELSE
       |        CASE WHEN (TabSprGr1.DESCR IS NOT NULL)
       |                AND (TabSprGr2.DESCR IS NOT NULL)
       |                AND (TabSprGr3.DESCR IS NOT NULL) THEN TabSprGr1.DESCR
       |             ELSE
       |             CASE WHEN (TabSprGr1.DESCR IS NOT NULL) AND (TabSprGr2.DESCR IS NOT NULL) AND (TabSpr.IsFolder = 1) THEN TabSpr.DESCR
       |             END
       |       END
       |    END гр3,
       |   CASE WHEN (TabSprGr1.DESCR IS NOT NULL)
       |          AND (TabSprGr2.DESCR IS NOT NULL)
       |          AND (TabSprGr3.DESCR IS NOT NULL)
       |          AND (TabSprGr4.DESCR IS NOT NULL) THEN TabSprGr1.DESCR
       |         ELSE
       |         CASE WHEN (TabSprGr1.DESCR IS NOT NULL) AND (TabSprGr2.DESCR IS NOT NULL) AND (TabSprGr3.DESCR IS NOT NULL) AND (TabSpr.IsFolder = 1) THEN TabSpr.DESCR
       |         END
       |    END гр4    
       |FROM  $Справочник.Номенклатура As  TabSpr (nolock)
       |        LEFT OUTER JOIN $Справочник.Номенклатура As  TabSprGr1 (nolock) ON TabSpr.PARENTID = TabSprGr1.ID
       |        LEFT OUTER JOIN $Справочник.Номенклатура As TabSprGr2 (nolock) ON TabSprGr1.PARENTID = TabSprGr2.ID
       |        LEFT OUTER JOIN $Справочник.Номенклатура As TabSprGr3 (nolock) ON TabSprGr2.PARENTID = TabSprGr3.ID
       |        LEFT OUTER JOIN $Справочник.Номенклатура As TabSprGr4 (nolock) ON TabSprGr3.PARENTID = TabSprGr4.ID
       |WHERE (TabSpr.IsMark = 0) AND ($TabSpr.НеВключатьВпрайс = 0) AND ((TabSpr.ID IN (SELECT Val FROM #спЭлементов)) OR (TabSpr.IsFolder = 1))
       |ORDER BY гр1,гр2,гр3,гр4,Наименование


... но такое чудо для каждой группировки это невозможно просто....

может уже что придумано чтоб прямые запросы выдавали тоже что и "стандартные"
1 palpetrovich
 
16.08.11
14:41
Хм сюда не ходит, переименуй тему в "Епрст3... отчет с "неопределенными" группировками " :)
2 AMKahm
 
16.08.11
14:48
101 ОК.. а как переименовать тему....??? кнопки ПРАВКА не наметил чегото...
3 palpetrovich
 
16.08.11
14:52
(2) пошутил я, переименовать модератор может, а по сути - я так понял что на встроенном языке у тебя получается слишком долго, поэтому попытка перевести на прямые запросы
если да - то лучше заведи новую тему. в которой обязательно упомяни о "прямых". Так быстрее подтянутся спецы по них
4 AMKahm
 
16.08.11
14:56
я смотрю тему уже переименовали! Спасибо!
5 Ёпрст
 
гуру
16.08.11
14:57
>>>Следующая хрень выдаст примерно тоже, что и Запрос стандартными средствами по номенклатуре:

как запрос к справочнику может выдать тоже, что и запрос к регистру Продажи - не ясно..
:)
6 palpetrovich
 
16.08.11
14:57
(4) ну дык, это-ж волшебный форум... ;)
7 Ёпрст
 
гуру
16.08.11
14:58
+5 да и .. иерархию лучше по-другому делать, и во всяком случае, без case-ов
8 Ёпрст
 
гуру
16.08.11
15:00
А так, для твоего отчета ВТ обороты + динамический текст запроса. + вывод, либо через индексированную тЗ, либо через класс, либо еще как.
9 AMKahm
 
16.08.11
15:01
ну запрос к справочнику я для примера привел.... под также я имел ввиду - также сгруппирован, ну примерно,

как без кейсов еЁ сделать не подскажите?
10 AMKahm
 
16.08.11
15:03
хм.. про индексированную понял... возможно... но как группировки то сделать... я 5 для примера привел.. у меня их там 19 на самом деле...
11 Ёпрст
 
гуру
16.08.11
15:04
(9) самое простое - создать табличку в скуле на соответствие родителей.. и тригером её обновлять.
Затем просто иметь всю иерархию быстро в самом запросе.

Ну или куча лефтджоинов по парентид = количеству уровней  справочника (это, если иерархия нужна в самой табличке )

Или,в индексированной тз разворачивать.
12 AMKahm
 
16.08.11
15:08
да... думал об этом тож.... но это ценая куча быдлокода по сравнению с стандартным путем... боюсь следующий за мной чел ниасилит сиё чюдо...

.... списибо за совет! всй вродт полял... буду думать что лучше...
13 Ёпрст
 
гуру
16.08.11
15:13
(12) ну, используй готовые классы и твоя тонна кода превратится в пару строк для построения любого отчета..
+юзай конструктор запросов и консоль отчета.
делов то, на пару часов на всё
14 AMKahm
 
16.08.11
15:17
... готовые!? как зовуться скажите пожалуйста.
15 Ёпрст
 
гуру
16.08.11
15:31
класс.Прямой запрос - разновидностей и вариантов вагон.
Самый удачный, этот
http://www.1cpp.ru/forum/YaBB.pl?num=1246429625
http://www.1cpp.ru/forum/YaBB.pl?num=1285352210

для бухни этот:
http://www.1cpp.ru/forum/YaBB.pl?num=1181817217

консоль
http://www.1cpp.ru/forum/YaBB.pl?num=1191511579/0
она же
http://infostart.ru/public/15517/

конструктор
http://www.1cpp.ru/forum/YaBB.pl?num=1148127139/0#0
он же
http://infostart.ru/public/14933/

еще куча консолей тут
http://www.1cpp.ru/forum/YaBB.pl?num=1157967835/all

класс для отчетов
http://www.1cpp.ru/forum/YaBB.pl?num=1202201945

ну и т.д..
16 Ёпрст
 
гуру
16.08.11
15:32
есть еще поделка, которая чорный запрос на прямой пытается переделать сама.. турбо-запрос зовётся.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший