Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе. (число прочтений - 13109 )
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
17. Октября 2012 :: 10:28
Печать  
Помогите, кто знает, как в прямом запросе реализовать "ВСЕ Вошедшие в запрос".

     ТекстЗапроса="
     |      SELECT  
     |            СпрНоменклатура.ID as      [СпрНом $Справочник.Номенклатура],
     |        РегОстатки.Товар as      [Тов $Справочник.Номенклатура],
     |            РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     |            РегОстатки.ОстатокТовараОстаток
         |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+" ,(Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки
         |   left join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = РегОстатки.Товар

     Данный запрос выводит остатки товаров на складах.
     В конкретном случае выходят остатки по двум товарам, первый товар есть на двух складах, а другой на трех.
     (Всего в таблицу попадает 5 строк)
     Нужно чтобы первый товар был показан с нулевым остатком и на третьем складе, т.е. как при "ВСЕ Вошедшие в запрос".
     (В таблице тогда будет 6 строк, 3 строки по каждому товару)
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #1 - 27. Октября 2012 :: 14:28
Печать  
Попробуй запрос к справочнику, в левом соединении ВТ
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #2 - 27. Октября 2012 :: 14:37
Печать  
Это как, на примере кода можешь показать?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #3 - 27. Октября 2012 :: 16:31
Печать  
Код
Выбрать все
SELECT Номенклатура.ID [Ссылка $Справочник.Номенклатура]
	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
FROM $Справочник.Номенклатура AS Номенклатура
	LEFT JOIN $РегистрОстатки.ОстаткиТоваров(,
		RIGHT JOIN $Справочник.Номенклатура AS Номенклатура ON Номенклатура.ID = Товар,,
		Товар,
		ОстатокТовара) AS ОстаткиТоваровОстатки ON Номенклатура.ID = ОстаткиТоваровОстатки.Товар
 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #4 - 28. Октября 2012 :: 06:06
Печать  
Так выходит весь справочник номенклатура и потом уже к нему присоединяется то, что отобрано из регистра остатки, т.к. справочник слева а регистр справа, то справочник - весь.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #5 - 29. Октября 2012 :: 05:12
Печать  
Vlad7131 писал(а) 28. Октября 2012 :: 06:06:
Так выходит весь справочник номенклатура и потом уже к нему присоединяется то, что отобрано из регистра остатки, т.к. справочник слева а регистр справа, то справочник - весь.



Забить на левое соединение со справочником номенклатура, написать запрос к регистру ручонками, без использования ВТ - поиметь все итоги регистра, в том числе нулевые, убрав из запроса having

Пример текста запроса есть в FAQ в статье.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #6 - 29. Октября 2012 :: 08:22
Печать  
Регистр не хранит нулевые записи, где то в документации 1С есть.
Все равно попробовал, несложно, включаешь отладку и парсер выдает чистый запрос sql.
Попробовал, убрал having, и даже isnull в двух местах поставил,
результат тот же - запрос работает, но выдает те же строки.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #7 - 29. Октября 2012 :: 08:27
Печать  
Улыбка)

Еще как хранит.
Но дело не в этом.
ЗЫ: текст запроса то приведи, на каком пробовал.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #8 - 29. Октября 2012 :: 08:33
Печать  
Если что, нулевых итогов в табличке RG может быть до едрени фени, при работе "задним числом" или какой-нибудь свертке.
Да и при обычном проведении их хватает, просто в следующий период , при открытии периода эти строки не переносятся. И усё.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #9 - 29. Октября 2012 :: 08:44
Печать  
Это на 1С++:
     |      SELECT  
     |        РегОстатки.Товар as      идТовар,
     |            РегОстатки.Склад as идСклад,
     |            РегОстатки.ОстатокТовараОстаток as Остаток
   |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+"
   |,
     |                               (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки  
А это выдал парсер:
     SELECT  
       РегОстатки.Товар as      идТовар,
           РегОстатки.Склад as идСклад,
           РегОстатки.ОстатокТовараОстаток as Остаток
     FROM
           (
select
rr99_vt.sp3603 as Фирма,
rr99_vt.sp101 as Товар,
rr99_vt.sp100 as Склад,
sum(rr99_vt.sp102) as ОстатокТовараОстаток
from (
select
rg99_vt.sp3603,
rg99_vt.sp101,
rg99_vt.sp100,
rg99_vt.sp102
from rg99 as rg99_vt (nolock)
inner join sc33 as СпрНоменклатура (nolock) on СпрНоменклатура.id = rg99_vt.sp101            inner join sc31 as СпрСклады (nolock) on СпрСклады.id = rg99_vt.sp100
where rg99_vt.period={d '2012-09-01'}
and ((rg99_vt.sp3603='     0   ') AND (СпрНоменклатура.IsFolder=2) AND СпрНоменклатура.ID IN ('   785ЦБ ','   3A2ЦБ '))
union all
select
ra99_vt.sp3603,
ra99_vt.sp101,
ra99_vt.sp100,
case ra99_vt.debkred when 0 then ra99_vt.sp102 else -ra99_vt.sp102 end
from ra99 as ra99_vt (nolock)
inner join _1sjourn as j99_vt (nolock) on j99_vt.iddoc = ra99_vt.iddoc
inner join sc33 as СпрНоменклатура (nolock) on СпрНоменклатура.id = ra99_vt.sp101            inner join sc31 as СпрСклады (nolock) on СпрСклады.id = ra99_vt.sp100
where j99_vt.date_time_iddoc > '20121001' and j99_vt.date_time_iddoc < '20121016Z'
and j99_vt.rf99 = 0x1
and ((ra99_vt.sp3603='     0   ') AND (СпрНоменклатура.IsFolder=2) AND СпрНоменклатура.ID IN ('   785ЦБ ','   3A2ЦБ '))
) as rr99_vt
group by
rr99_vt.sp3603,
rr99_vt.sp101,
rr99_vt.sp100
having
sum(rr99_vt.sp102) <> 0
) as РегОстатки  
//"having sum(rr99_vt.sp102) <> 0" уже убирал
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #10 - 29. Октября 2012 :: 08:51
Печать  
выкини из ВТ соединения со справочниками - ты их всё равно никак не используешь, ни в селекте , ни в фильтре, это раз,
выкини having, это два .. наслаждайся

ЗЫ: и зачетно увидеть в запросе что-то еще, кастрировав его этим (ограничив 2-мя элементами, если быть точнее) :
СпрНоменклатура.ID IN ('   785ЦБ ','   3A2ЦБ '))

ЗЫ: ну и нелепое условие на номенклатуру и изфолдер выкини, как и соединение по ней.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #11 - 29. Октября 2012 :: 09:09
Печать  
Два элемента это для тестирования, вообще там на форме ВыбТовар и ВыбСклад - списки значений, в которых могут быть и группы и элементы, а это выдает функция filter, которая кстати и ислользует inner join со справочниками склады и Номенклатура.
А как еще отобрать в отчет по остаткам товаров на складах нужные
товары и на нужных складах. Отчет - самый что есть типовой.
Нухно чтобы работал быстро, вот и приходится писать sql запрос.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #12 - 29. Октября 2012 :: 09:19
Печать  
Цитата:
$РегистрОстатки.<ИмяРегистра>([<ГраницаРасчета>][,        <Соединение>][,        <Условие>][,        <Измерение>][,<Ресурс>]
) [as <Алиас>]


Запихать  в <Условие>  отбор по измерениям Номенклатура и Склад и всего лишь, для этого пихать что-то еще в <Соединение> не нужно!

Ибо ты потом это соединение нигде не используешь.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #13 - 29. Октября 2012 :: 09:44
Печать  
Соединене использую в filter, так как в ВыбТовар могут быть и группы и товары и не по одному разу, пришлось использовать наряду с  "ID in" также и "ParentID IN".
Да и что это даст, если убрать соединения, появятся строки с 0 ?
Вряд ли, хотя проверить на 2 товарах не трудно, для примера специально отобрал 2 товара 1 из которых есть на 3 складах, а второй только на 2 из этих трех. Всего запрос выдает 5 строк,
а хорошо было бы - 6, 2 товара на 3 складах.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #14 - 29. Октября 2012 :: 09:50
Печать  
Vlad7131 писал(а) 29. Октября 2012 :: 09:44:
Соединене использую в filter, так как в ВыбТовар могут быть и группы и товары и не по одному разу, пришлось использовать наряду с  "ID in" также и "ParentID IN".
Да и что это даст, если убрать соединения, появятся строки с 0 ?
Вряд ли, хотя проверить на 2 товарах не трудно, для примера специально отобрал 2 товара 1 из которых есть на 3 складах, а второй только на 2 из этих трех. Всего запрос выдает 5 строк,
а хорошо было бы - 6, 2 товара на 3 складах.


И чего с того ?
Уложить в Список плевать на твои группы - положит туда всю иерархию.
А что даст - ускорение в разы работу запроса.

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать