Имя: Пароль:
1C
1C 7.7
v7: "Все" в прямом запросе
0 Pr0gLamer
 
06.11.12
11:52
Доброе утро!
Подскажите пожалуйста,как сделать аналог "все" или "все вошедшие в запросе" в прямом запросе?
Я пишу вот так(хочу получить "все"):

ТекстЗапроса = "
       |SELECT
       |    Спр.ID [Товар $Справочник.Номенклатура],
       |    SUM($Рег.ОстатокТовара) as Количество
       |FROM
       |    $Справочник.Номенклатура As Спр
           |LEFT JOIN
       |   $РегистрИтоги.ОстаткиТоваров as Рег
       |ON    
       |    $Рег.Товар = Спр.ID  
       |WHERE
       |    Рег.Period = Convert(DateTime,'"+ стрдатыТА +"',112)  AND  
       |    Спр.ID IN (SELECT Val FROM #ВыбТовар) AND
       |    $Рег.Фирма = :ВыбФирма
       |GROUP BY Спр.ID";


Выдаёт только товары,у которых есть  итоги по регистру!
1 yuch
 
06.11.12
11:56
Делай через Full join
2 Pr0gLamer
 
06.11.12
11:57
делал,тот же результат
3 OFF
 
06.11.12
11:57
LEFT, RIGHT, FULL ,CROSS JOIN ........
4 Mikeware
 
06.11.12
11:58
(2) врешь, похоже...
5 Pr0gLamer
 
06.11.12
11:59
"FULL JOIN" лепить вместо "LEFT JOIN" ?
6 yuch
 
06.11.12
12:00
У тебя там в запросе каша в условиях.
Но в целом должно быть FULL JOIN.
7 hunter76
 
06.11.12
12:00
(0) может надо $регистрИтогиОбороты ?
8 hunter76
 
06.11.12
12:01
+(7) точнее  $РегистрОстаткиОбороты
9 Pr0gLamer
 
06.11.12
12:03
мне нужно получить все остатки в т.ч. нулевые,обороты мне не нужны
   ТекстЗапроса = "
       |SELECT
       |    Спр.ID [Товар $Справочник.Номенклатура],
       |    SUM($Рег.ОстатокТовара) as Количество
       |FROM
       |    $Справочник.Номенклатура As Спр
       |FULL JOIN
       |   $РегистрИтоги.ОстаткиТоваров as Рег
       |ON    
       |    $Рег.Товар = Спр.ID  
       |WHERE
       |    Рег.Period = Convert(DateTime,'"+ стрдатыТА +"',112)  AND  
       |    $Рег.Товар IN (SELECT Val FROM #ВыбТовар) AND
       |    $Рег.Фирма = :ВыбФирма
       |GROUP BY Спр.ID";

только итоги...
10 ADirks
 
06.11.12
12:03
($Рег.Фирма Is Null OR $Рег.Фирма = :ВыбФирма)
11 ADirks
 
06.11.12
12:04
ну и сразу уж
SUM(IsNull($Рег.ОстатокТовара, 0))
12 viktor_vv
 
06.11.12
12:05
(9) Ты в Where запихнул условия по итогам, они накладываются на результирующую таблицу поле соединения, либо перенеси эти условия в "on", либо используй виртуальную таблицу остатков.
13 yuch
 
06.11.12
12:05
ТекстЗапроса = "
       |SELECT
       |    Спр.ID [Товар $Справочник.Номенклатура],
       |    SUM($Рег.ОстатокТовара) as Количество
       |FROM
       |    $Справочник.Номенклатура As Спр
       |LEFT JOIN
       |   $РегистрИтоги.ОстаткиТоваров(,Товар IN (SELECT Val FROM #ВыбТовар) AND Фирма = :ВыбФирма) as Рег
       |ON    
       |    Спр.ID = $Рег.Товар
       |WHERE
       |    Рег.Period = Convert(DateTime,'"+ стрдатыТА)";
14 viktor_vv
 
06.11.12
12:06
*после соединения.
15 Pr0gLamer
 
06.11.12
12:06
точно.спасибо
16 Ёпрст
 
06.11.12
12:09
(13) это не верно
17 yuch
 
06.11.12
12:09
(16) Что именно?
18 ADirks
 
06.11.12
12:13
А лучше бы вот так сказать.
|FROM
|    $Справочник.Номенклатура As Спр
|    LEFT JOIN $РегистрИтоги.ОстаткиТоваров as Рег ON    
|        $Рег.Товар = Спр.ID
|        AND Рег.Period = Convert(DateTime,'"+ стрдатыТА +"',112)
|        AND $Рег.Фирма = :ВыбФирма
|WHERE
|    Спр.ID IN (SELECT Val FROM #ВыбТовар) AND


Т.е. все условия на связываемую таблицу указать в ON, а не в финальном WHERE. Результат один, но так понятнее.
19 viktor_vv
 
06.11.12
12:13
(17) У тебя тоже получился inner join .
20 Ёпрст
 
06.11.12
12:14
(18) тоже не верно, ну да ладно
21 Ёпрст
 
06.11.12
12:14
(17) условие на период в where
22 yuch
 
06.11.12
12:15
(19) Если ты про Where, то согласен. Должно быть в условии виртуальной таблицы или соединении.
23 yuch
 
06.11.12
12:16
(21) Спешил, не  вникал. Главное показал суть, как мне кажется.
24 Pr0gLamer
 
06.11.12
12:18
|SELECT
       |    Спр.ID [Товар $Справочник.Номенклатура],
       |    SUM($Рег.ОстатокТовара) as Количество
       |FROM
       |    $Справочник.Номенклатура As Спр
       |FULL JOIN
       |   $РегистрИтоги.ОстаткиТоваров as Рег
       |ON    
       |    $Рег.Товар = Спр.ID
       |AND
       |    Рег.Period = Convert(DateTime,'"+ стрдатыТА +"',112)  
       |AND  
       |    $Рег.Фирма = :ВыбФирма
       |WHERE
       |    Спр.ID IN (SELECT Val FROM #ВыбТовар)
       |GROUP BY Спр.ID";
сделал,полкучилось,ошибку уяснил.Скажитен пожалуйста,а как организовать "Все вошедшие в зпрос"
25 yuch
 
06.11.12
12:19
Если ламер, зачем бежишь впереди паравоза?
26 Pr0gLamer
 
06.11.12
12:20
я как раз постепенно - от менее сложного к более
27 Ёпрст
 
06.11.12
12:20
(24)в данном случае (при запросе на та) - всё тоже самое, только без выборки справочника
28 yuch
 
06.11.12
12:21
(24) Отбор необходимо производить в виртуальной таблице остатков.
В твоем случае лучше делать левое соединение где справочник номенклатуры основная таблица.
29 yuch
 
06.11.12
12:21
Где то так.
30 yuch
 
06.11.12
12:22
ТекстЗапроса = "
       |SELECT
       |    Спр.ID [Товар $Справочник.Номенклатура],
       |    SUM($Рег.ОстатокТовара) as Количество
       |FROM
       |    $Справочник.Номенклатура As Спр
       |LEFT JOIN
       |   $РегистрИтоги.ОстаткиТоваров(Convert(DateTime,'"+ стрдатыТА),Товар IN (SELECT Val FROM #ВыбТовар) AND Фирма = :ВыбФирма) as Рег
       |ON    
       |    Спр.ID = $Рег.Товар"

Все условия по отобору остатков делаем  в виртуальной таблице. Соединение делаем только по ИД
31 Pr0gLamer
 
06.11.12
12:26
(27) не совсем понял (
32 Pr0gLamer
 
06.11.12
12:27
(30) разве так получается не "Все",
33 yuch
 
06.11.12
12:28
(32) Я так понял тебе нужно вся номенклатура?
34 Ёпрст
 
06.11.12
12:30
(31) из своего запроса выкинь from справочник, оставь только селект регистритоги и гроупбай - получишь "все вошедшие в запрос.."
35 Pr0gLamer
 
06.11.12
12:32
Всем спасибо,вопрос решён
36 Pr0gLamer
 
06.11.12
13:01
а сделать так,чтобы первая группировка была "все"(Товар),а вторая (Склады)"Все вошедшие в запрос" возможно?
37 Ёпрст
 
06.11.12
13:02
да
38 Pr0gLamer
 
06.11.12
13:07
(37) можно подсказоньку?
39 Ёпрст
 
06.11.12
13:21
(38)
select
  таб.товар as [Товар $Справочник.нужныйвид]
  ,таб.склад as [Склад $Справочник.Склады]
  sum(Таб.Остаток)
from
(
 select Спр.id Товар
 ,Рег.Склад Склад
 ,РегОст.ОстатокКоличество Остаток
from $Справочник.Номенклатура Спр
left join   $РегистрИтоги.ОстаткиТоваров(,,Товар IN (SELECT Val FROM #ВыбТовар AND Фирма = :ВыбФирма,(Склад,Товар),(Количество)) as РегОст
cross join
 $РегистрИтоги.ОстаткиТоваров(,,Товар IN (SELECT Val FROM #ВыбТовар AND Фирма = :ВыбФирма,(Склад,Товар),(Количество)) as Рег


)as Таб
group by таб.товар,таб.склад
40 Ёпрст
 
06.11.12
13:22
зы
--,РегОст.ОстатокКоличество Остаток
,isnull(РегОст.ОстатокКоличество,0) Остаток
41 Ёпрст
 
06.11.12
13:23
+
left join   $РегистрИтоги.ОстаткиТоваров(,,Товар IN (SELECT Val FROM #ВыбТовар AND Фирма = :ВыбФирма,(Склад,Товар),(Количество)) as РегОст on РегОст .Товар = Спр.id
42 Ёпрст
 
06.11.12
13:24
хотя не.. так не совсем верно
43 Pr0gLamer
 
06.11.12
13:27
мне в принципе даже "все","все"подойдёт,на сайте потом поправят
2 + 2 = 3.9999999999999999999999999999999...