Имя: Пароль:
1C
1C 7.7
v7: Все ВошедшиеВЗапрос и 1С++
0 woha
 
28.03.13
16:46
Доброго времени суток! Кто-нибудь пробовал реализовать конструкцию "Все ВошедшиеВЗапрос" с промощью 1с++?
Нашел пример:
ТекстЗапроса = "
|SELECT
|    РегТовар.Товар Товар,    
|    РегСклад.Склад Склад,    
|    РегКолво.Количество Количество
|FROM
|(
|SELECT DISTINCT
|    РегТовар.Товар Товар    
|FROM
|    $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|                                 Фирма = :ВыбФирма,
|                                (Товар), (Количество)) as РегТовар
|) as РегТовар,
|(
|SELECT DISTINCT
|    РегСклад.Склад Склад    
|FROM
|    $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|                                 Фирма = :ВыбФирма,
|                                (Склад), (Количество)) as РегСклад
|) as РегСклад
|LEFT JOIN
|(
|SELECT
|    РегКолво.КоличествоОстаток Количество,    
|    РегКолво.Товар Товар,    
|    РегКолво.Склад Склад    
|FROM
|    $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|                                 Фирма = :ВыбФирма,
|                                (Склад, Товар), (Количество)) as РегКолво
|) as РегКолво ON РегКолво.Склад = РегСклад.Склад AND
|                 РегКолво.Товар = РегТовар.Товар    
|";
и по нему постоил свой запрос, но он не работает.
Спасибо.
1 Ёпрст
 
28.03.13
16:47
весьма забавный запрос
2 woha
 
28.03.13
16:50
(1) Писатель примера взял за основу ToySQL:
На основе статьи с сайта 1csql.ru http://1csql.ru/materials/articles/sql/001.html
3 Дык ё
 
28.03.13
16:53
(0) а если cross join вместо запятой?

а еще можно забить на эти мутные джойны и написать group by with cube
4 woha
 
28.03.13
16:53
5 Ёпрст
 
28.03.13
17:02
я бы вот это пользовал и привет, а получал бы обычную плоскую таблицу
http://www.1cpp.ru/forum/YaBB.pl?num=1202201945
6 woha
 
28.03.13
17:05
(3) with cube не помогло
7 woha
 
28.03.13
17:07
(5) суть не в итогах по группировкам, а в выводе всех измерений регистра даже если значение ресура 0
8 Mikeware
 
28.03.13
17:08
(7) ну и соединяй со справочниками-измерениями..
9 woha
 
28.03.13
17:08
для этого в 1с и есть Все ВошедшиеВЗапрос
10 Ёпрст
 
28.03.13
17:08
(7) ну, не используй ВТ - напиши запрос руктями + having выкинь оттуда - будут тебе 0
11 woha
 
28.03.13
17:13
Это оригинал 1с:

 |Тип = Документ.РасходнаяНакладная.ПризнакНакладной;
    |Тип2 = Документ.ПриходнаяНакладная.ПризнакНакладной;
    |Експедитор= Документ.РасходнаяНакладная.Експедитор;
    |Тов = Документ.РасходнаяНакладная.Товар,Документ.ПриходнаяНакладная.Товар;
    |ГрТов = Документ.РасходнаяНакладная.Товар.ГрупаТМЦ,Документ.ПриходнаяНакладная.Товар.ГрупаТМЦ;
    |Скл = Документ.РасходнаяНакладная.Склад,Документ.ПриходнаяНакладная.Склад;
    |ГрКлиент = Документ.РасходнаяНакладная.Клиент.ГрупаКлн,Документ.ПриходнаяНакладная.Клиент.ГрупаКлн;
    |Клиент = Документ.РасходнаяНакладная.Клиент,Документ.ПриходнаяНакладная.Клиент;
    |Колво = Документ.РасходнаяНакладная.Количество,Документ.ПриходнаяНакладная.Количество;
    |Сум = Документ.РасходнаяНакладная.Сумма,Документ.ПриходнаяНакладная.Сумма;
    |Функция Кво = Сумма(Колво) когда (Тип=Перечисление.ПризнРасхНакл.Продажа);
    |Функция Сума = Сумма(Сум) когда (Тип=Перечисление.ПризнРасхНакл.Продажа);
    |Функция КвоВ = Сумма(Колво) когда (Тип2=Перечисление.ПризнПрихНакл.ВозвратОтПокупателя);
    |Функция СумаВ = Сумма(Сум) когда (Тип2=Перечисление.ПризнПрихНакл.ВозвратОтПокупателя);
    |Группировка ГрТов без групп;
    |Группировка Тов без групп;
    |Группировка Клиент без групп Все ВошедшиеВЗапрос;";
12 woha
 
28.03.13
17:14
Это 1С++

ТекстЗапроса = "
   |SELECT
   |
   |        Все.ГрупаТМЦ as ГрупаТМЦ
   |,        Все.Тов as Тов
   |,        Все.Клиент as Клиент
   |,        GROUPING(Все.ГрупаТМЦ) as ИтогПоГрупаТМЦ
   |,        GROUPING(Все.Тов) as ИтогПоТовар
   |,        GROUPING(Все.Клиент) as ИтогПоКлиент
   |,        SUM(Все.Кво) as Кво
   |,        SUM(Все.Сума) as Сума
   |,        SUM(Все.КвоВ) as КвоВ
   |,        SUM(Все.СумаВ) as СумаВ
   |
   |FROM
   |
   |(
   |SELECT
   |        $ТМЦ.ГрупаТМЦ as ГрупаТМЦ
   |,        $ТчДокР.Товар as Тов
   |,        $ДокР.Клиент as Клиент
   |,        (SUM(CASE
   |                WHEN $ДокР.ПризнакНакладной = :Продажа THEN $ТчДокР.Количество ELSE 0 END)) as Кво
   |,        (SUM(CASE
   |                WHEN $ДокР.ПризнакНакладной = :Продажа THEN $ТчДокР.Сумма ELSE 0 END)) as Сума
   |,        0 as КвоВ
   |,        0 as СумаВ
   |
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокР.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокР.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ТМЦ.ГрупаТМЦ
   |,        $ТчДокР.Товар
   |,        $ДокР.Клиент
   |
   |UNION ALL
   |
   |SELECT
   |        $ТМЦ.ГрупаТМЦ as ГрупаТМЦ
   |,        $ТчДокП.Товар as Тов
   |,        $ДокП.Клиент as Клиент
   |,        0 as КвоР
   |,        0 as СумаР
   |,        (SUM(CASE
   |                WHEN $ДокП.ПризнакНакладной = :Возврат THEN $ТчДокП.Количество ELSE 0 END)) as КвоВ
   |,        (SUM(CASE
   |                WHEN $ДокП.ПризнакНакладной = :Возврат THEN $ТчДокП.Сумма ELSE 0 END)) as СумаВ
   |
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокП.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокП.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ТМЦ.ГрупаТМЦ
   |,        $ТчДокП.Товар
   |,        $ДокП.Клиент ) Все
   |GROUP BY
   |        Все.ГрупаТМЦ
   |,        Все.Тов
   |,        Все.Клиент WITH ROLLUP
   |";
13 Ёпрст
 
28.03.13
17:14
(11) зачет, ага.
Какое отношение ЭТО имеет к запросу в (0) ?
14 woha
 
28.03.13
17:15
это был пример реализации
15 Ёпрст
 
28.03.13
17:19
WITH ROLLUP лучше не писать..это устаревший синтаксис
16 woha
 
28.03.13
17:26
(15) Что с ним, что без него (разве что строку группировки дает)
17 Ёпрст
 
28.03.13
17:26
Ачего не устраивает в запросе ?
18 Ёпрст
 
28.03.13
17:28
ну окромя того, что он не оптимальный..
19 woha
 
28.03.13
17:30
Все ВошедшиеВЗапрос в запросе 1С++ не реализован
20 Ёпрст
 
28.03.13
17:34
(19) :))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
21 Ёпрст
 
28.03.13
17:34
Кто тебе сказал такую дурость ?
22 woha
 
28.03.13
17:35
(21)в моем запросе не реализован а не вообще
23 Ёпрст
 
28.03.13
17:36
1cpp тебе всего лишь предоставляет удобный инструмент доступа к данным и..даже ВТ для твоего удобства слепили.
Нужно большее - пиши руктями запрос, получай, всё что угодно
24 Ёпрст
 
28.03.13
17:36
(22) что именно в твоём запросе не реализовано ?
Тебе может нужно Группировка Клиентос ВСЕ ?
25 Ёпрст
 
28.03.13
17:37
Если че, Все ВошедшиеВЗапрос - это только то, что функция считала, т.е только те клиентосы, которые реально есть в выборке, а не все, что в справочнике.
26 Ёпрст
 
28.03.13
17:39
Нужны все , что есть в справочнике - велком соединение с табличкой справочника
27 woha
 
28.03.13
17:39
(25) не только не все что в справочнике а все которые вошли в запрос
28 woha
 
28.03.13
17:39
(26) это разные вещи
29 Ёпрст
 
28.03.13
17:40
(28) я как бэ в курсе.
Еще раз, чем тебя твой запрос не угодил ?
Он сейчас аналогичен Все Вошедшие в запрос
30 woha
 
28.03.13
17:40
очтет строится не только добавляя строки, но и колонки.
31 woha
 
28.03.13
17:40
(29) совсем не аналогичен.
32 woha
 
28.03.13
17:42
(29) по одному товару выдет 20 клиентов а по другому только 2, а надо и там и там по 20
33 woha
 
28.03.13
17:43
(29) Это как раз и делает Все ВошедшиеВЗапрос
34 Ёпрст
 
28.03.13
17:45
(32) выкини union, используй left join + coalesce
либо делай cross join + group by самим с собой
35 Ёпрст
 
28.03.13
17:58
в твоём случае, примерно так:

select
 coalesce($Расх.Товар,$Прих.Товар,$Возвр.Товар) as [Товар $Справочник.Товарчики]
 ,coalesce($РасхШ.Клиентос,$ПрихШ.Клиентос,$ВозврШ.Клиентос) as [Товар $Справочник.Клиентосы]
from _1sjourn as Жур (nolock)
left join $Документ.Расходная as РасхШ (nolock) on РасхШ.iddoc = Жур.iddoc
left join $ДокументСтроки.Расходная as Расх (nolock) on Расх.iddoc = Жур.iddoc
left join $Документ.Приходная as ПрихШ (nolock) on ПрихШ .iddoc = Жур.iddoc
.....

where Жур.iddocdef in ($ВидДокумента.Приходная,$ВидДокумента.Расходная,$ВидДокумента.Возвратик)
and Жур.Date_Time_IDDoc between :НачДата AND :КонДата~
36 Ёпрст
 
28.03.13
17:59
ну и воткнуть туды sum и uhjeg,fq
37 Ёпрст
 
28.03.13
17:59
group by
38 woha
 
28.03.13
17:59
(34) Из описания: Это очень опасно для таблиц, содержащих большое количество данных. То есть получаются ВСЕ возможные
комбинации, включая все Null-null строчки.

сейчас в запросе около 15000 строк а с cross join скольбо будет? 15000 в квадрате. мне не нужны строки типа null-null. достаточно значение - null
39 woha
 
28.03.13
18:08
(35) Спасибо, это попробую.
40 toypaul
 
гуру
28.03.13
19:36
чтобы сделать правильный запрос, надо подучить теорию множеств. одним из видов языков работы с множествами является SQL.
41 toypaul
 
гуру
28.03.13
19:47
для начала надо сделать временную таблицу фактов через UNION. а потом по ссылке указанном на моем сайте, сделать уже основной запрос - там в конце статьи полностью аналогичный запрос.
42 woha
 
28.03.13
19:52
(41) Да, ToySQL это делает намного лучше. :)
43 ADirks
 
29.03.13
09:32
Вот я в очередной раз поражаюсь...
Далось вам это ВсеВошедшие. 1С смешало в кучу получение данных и отображение их, и у всех моск набок.
Если надо показать что данных нет - сделай это при выводе в отчёт, не парь моск серверу.
44 woha
 
02.04.13
17:58
(43) мне как раз для вывода отчета и нужно "Все ВошедшиеВЗапрос".
45 ADirks
 
03.04.13
07:02
(44) ну так получи этих всех на клиенте, какие проблемы?
46 woha
 
03.04.13
09:24
(45) На клиенте долго это получать. Запрос написанный под ToySQL это делает намного быстрее.
47 ADirks
 
03.04.13
09:40
Долго?  Каков же размер набора строк результата?
И потом, не нужно забывать, что SQL-сервер конечно эффективнее в работе с табличными данными, но ему потребуются дополнительные ресурсы для такой операции. 1С-клиенту _дополнительных_ ресурсов потребуется меньше.
48 woha
 
03.04.13
10:29
15000
49 woha
 
03.04.13
10:30
Клиент вообще все делает без ресуров, в цикле тупо перебирая строки.
50 ADirks
 
03.04.13
10:31
Даже тупо загрузить в другую ТЗ и свернуть по нужной колонке - фигня, по сравнению с формированием собственно печатной формы.
51 woha
 
03.04.13
10:37
Печатная форма меня вообще не интересует, что в отчете с запросом 1С что в 1С++  она формируется одинаковое время. А вот запрос 1С формирует результат несколько десятков минут.
52 ADirks
 
03.04.13
10:54
ну конечно, когда запрос 10мин, а печать 30 сек - не интересует. А вот когда запрос 1сек - то задумаешься и про печать.
А вообще я говорил про сравнительные затраты на разные операции. Оптимизировать надо в первую очередь наиболее затратные. А если затраты различаются в порядки - глупо вообще ими (мелкозатратными) заниматься.
53 woha
 
03.04.13
14:49
(41) Таки получилось. Не остаточный вариант, но Все ВошедшиеВЗапрос  делает. Не знаю, правда, где лучше применить фильтры, в каждом подзапросе или уже в самом верхнем обрезать лишнее.


ТекстЗапроса = "
   |SELECT
   |        ВсеТК.Тов as [Тов $Справочник.Товары]
   |,        ВсеТК.Клиент as [Клиент $Справочник.Контрагент]
   |,        Факт.Кво as Кво
   |,        Факт.Сума as Сума
   |,        Факт.КвоВ as КвоВ
   |,        Факт.СумаВ as СумаВ
   |FROM
   |        (
   |SELECT
   |        Товары.Тов as Тов
   |,        Клиенты.Клиент as Клиент
   |FROM
   |        (
   |SELECT
   |        Запр.Тов
   |FROM
   |        (
   |SELECT
   |        $ТчДокР.Товар as Тов
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокР.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокР.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ТчДокР.Товар
   |UNION ALL
   |
   |SELECT
   |        $ТчДокП.Товар as Тов
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокП.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокП.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ТчДокП.Товар
   |)Запр
   |GROUP BY
   |        Запр.Тов) Товары,
   |        (
   |SELECT
   |        Запр.Клиент
   |FROM
   |    (
   |SELECT
   |        $ДокР.Клиент as Клиент
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокР.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокР.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ДокР.Клиент
   |UNION ALL
   |
   |SELECT
   |        $ДокП.Клиент as Клиент
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокП.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокП.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ДокП.Клиент
   |)Запр
   |GROUP BY
   |        Запр.Клиент) Клиенты) ВсеТК
   |
   |LEFT JOIN
   |        (
   |SELECT
   |        Зап.Тов as Тов
   |,        Зап.Клиент as Клиент
   |,        SUM(Зап.Кво) as Кво
   |,        SUM(Зап.Сума) as Сума
   |,        SUM(Зап.КвоВ) as КвоВ
   |,        SUM(Зап.СумаВ) as СумаВ
   |FROM
   |        (
   |SELECT
   |        $ТчДокР.Товар as Тов
   |,        $ДокР.Клиент as Клиент
   |,        (SUM(CASE
   |                WHEN $ДокР.ПризнакНакладной = :Продажа THEN $ТчДокР.Количество ELSE 0 END)) as Кво
   |,        (SUM(CASE
   |                WHEN $ДокР.ПризнакНакладной = :Продажа THEN $ТчДокР.Сумма ELSE 0 END)) as Сума
   |,        0 as КвоВ
   |,        0 as СумаВ
   |
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокР.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокР.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ТчДокР.Товар
   |,        $ДокР.Клиент
   |
   |UNION ALL
   |
   |SELECT
   |        $ТчДокП.Товар as Тов
   |,        $ДокП.Клиент as Клиент
   |,        0 as КвоР
   |,        0 as СумаР
   |,        (SUM(CASE
   |                WHEN $ДокП.ПризнакНакладной = :Возврат THEN $ТчДокП.Количество ELSE 0 END)) as КвоВ
   |,        (SUM(CASE
   |                WHEN $ДокП.ПризнакНакладной = :Возврат THEN $ТчДокП.Сумма ELSE 0 END)) as СумаВ
   |
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |INNER JOIN
   |        $Справочник.Товары as ТМЦ
   |ON
   |        ТМЦ.ID = $ТчДокП.Товар
   |INNER JOIN
   |        $Справочник.Контрагент as Контр
   |ON
   |        Контр.ID = $ДокП.Клиент
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ТчДокП.Товар
   |,        $ДокП.Клиент
   |)Зап
   |
   |GROUP BY
   |        Зап.Тов
   |,        Зап.Клиент) Факт
   |ON
   |        Факт.Тов = ВсеТК.Тов
   |AND
   |        Факт.Клиент = ВсеТК.Клиент
   |";



Спасибо toypaul
54 woha
 
03.04.13
18:03
Это окончательный вариант:


ТекстЗапроса = "
   |SELECT
   |        $спТов.ГрупаТМЦ as [ГрупаТМЦ $Справочник.ГрупаТМЦ]
   |,        ВсеТК.Тов as [Тов $Справочник.Товары]
   |,        ВсеТК.Клиент as [Клиент $Справочник.Контрагент]
   |,        GROUPING($спТов.ГрупаТМЦ) as ИтогПоГрупаТМЦ
   |,        GROUPING(ВсеТК.Тов) as ИтогПоТовар
   |,        GROUPING(ВсеТК.Клиент) as ИтогПоКлиент
   |,        SUM(Факт.Кво) as Кво
   |,        SUM(Факт.Сума) as Сума
   |,        SUM(Факт.КвоВ) as КвоВ
   |,        SUM(Факт.СумаВ) as СумаВ
   |FROM
   |        (
   |SELECT
   |        Товары.Тов as Тов
   |,        Клиенты.Клиент as Клиент
   |FROM
   |        (
   |SELECT
   |        Запр.Тов
   |FROM
   |        (
   |SELECT
   |        $ТчДокР.Товар as Тов
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ТчДокР.Товар
   |UNION ALL
   |
   |SELECT
   |        $ТчДокП.Товар as Тов
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ТчДокП.Товар
   |)Запр
   |GROUP BY
   |        Запр.Тов) Товары,
   |        (
   |SELECT
   |        Запр.Клиент
   |FROM
   |    (
   |SELECT
   |        $ДокР.Клиент as Клиент
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ДокР.Клиент
   |UNION ALL
   |
   |SELECT
   |        $ДокП.Клиент as Клиент
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ДокП.Клиент
   |)Запр
   |GROUP BY
   |        Запр.Клиент) Клиенты) ВсеТК
   |
   |LEFT JOIN
   |        (
   |SELECT
   |        Зап.Тов as Тов
   |,        Зап.Клиент as Клиент
   |,        SUM(Зап.Кво) as Кво
   |,        SUM(Зап.Сума) as Сума
   |,        SUM(Зап.КвоВ) as КвоВ
   |,        SUM(Зап.СумаВ) as СумаВ
   |FROM
   |        (
   |SELECT
   |        $ТчДокР.Товар as Тов
   |,        $ДокР.Клиент as Клиент
   |,        (SUM(CASE
   |                WHEN $ДокР.ПризнакНакладной = :Продажа THEN $ТчДокР.Количество ELSE 0 END)) as Кво
   |,        (SUM(CASE
   |                WHEN $ДокР.ПризнакНакладной = :Продажа THEN $ТчДокР.Сумма ELSE 0 END)) as Сума
   |,        0 as КвоВ
   |,        0 as СумаВ
   |
   |FROM
   |        $Документ.РасходнаяНакладная as ДокР
   |INNER JOIN
   |        $ДокументСтроки.РасходнаяНакладная as ТчДокР
   |ON
   |        ДокР.IDDOC = ТчДокР.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокР.IDDOC = Жур.IDDOC
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие1 + "
   |GROUP BY
   |        $ТчДокР.Товар
   |,        $ДокР.Клиент
   |
   |UNION ALL
   |
   |SELECT
   |        $ТчДокП.Товар as Тов
   |,        $ДокП.Клиент as Клиент
   |,        0 as КвоР
   |,        0 as СумаР
   |,        (SUM(CASE
   |                WHEN $ДокП.ПризнакНакладной = :Возврат THEN $ТчДокП.Количество ELSE 0 END)) as КвоВ
   |,        (SUM(CASE
   |                WHEN $ДокП.ПризнакНакладной = :Возврат THEN $ТчДокП.Сумма ELSE 0 END)) as СумаВ
   |
   |FROM
   |        $Документ.ПриходнаяНакладная as ДокП
   |INNER JOIN
   |        $ДокументСтроки.ПриходнаяНакладная as ТчДокП
   |ON
   |        ДокП.IDDOC = ТчДокП.IDDOC
   |INNER JOIN
   |        " + Журн + " as Жур
   |ON
   |        ДокП.IDDOC = Жур.IDDOC
   |WHERE
   |        Жур." + ДатаДок + "
   |AND
   |       Жур." + Закрыт + " = 1
   |        " + Условие2 + "
   |GROUP BY
   |        $ТчДокП.Товар
   |,        $ДокП.Клиент
   |)Зап
   |
   |GROUP BY
   |        Зап.Тов
   |,        Зап.Клиент) Факт
   |ON
   |        Факт.Тов = ВсеТК.Тов
   |AND
   |        Факт.Клиент = ВсеТК.Клиент
   |INNER JOIN
   |        $Справочник.Товары as спТов
   |ON
   |        спТов.ID = ВсеТК.Тов
   | " + Условие5 + "
   |GROUP BY
   |        $спТов.ГрупаТМЦ
   |,        ВсеТК.Тов
   |,        ВсеТК.Клиент WITH ROLLUP
   |ORDER BY
   |        $спТов.ГрупаТМЦ
   |,        ВсеТК.Тов
   |,        ВсеТК.Клиент        
   |,        ИтогПоГрупаТМЦ DESC
   |,        ИтогПоТовар DESC
   |,        ИтогПоКлиент DESC
   |";
55 Ёпрст
 
03.04.13
18:18
какой то неправильный мёд
56 woha
 
03.04.13
23:31
(55) Но работает. Ищу оптимальный вариант размещения фильтров.