Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе. (число прочтений - 13094 )
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 записан
 
Eprst
God Member
*****
Отсутствует



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

Если уж очень хочется, то ВТ + union all
(select t1.val, t2.val,0 from #табличкаСТоваром,#табличкаCоСкладами)
ну и гроуп бай потом
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #16 - 29. Октября 2012 :: 11:29
Печать  
Процедура ОстаткиТоваров()
     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     Запрос = СоздатьОбъект("ODBCRecordset"); Запрос.Отладка(Отладка);
     
   Запрос.УложитьСписокОбъектов(ВыбТовары, "#ВТТовары", "Справочник.Номенклатура");
     Запрос.УложитьСписокОбъектов(ВыбСклад, "#ВТСклады", "Справочник.МестаХранения");

     ТекстЗапроса="
     |      SELECT  
     |        РегОстатки.Товар as      идТовар,
     |            РегОстатки.Склад as идСклад,
     |            РегОстатки.ОстатокТовараОстаток as Остаток
   |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~, ,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (Товар in ВТТовары) AND (Склад IN ВТСклады),    
       |                               (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки";
       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
КонецПроцедуры
Запрос.УложитьСписокОбъектов(ВыбТовары, "#ВТТовары", "Справочник.Номенклатура");
{\TEST_QUERY_УЛОЖИТЬСПИСОК.ERT(10)}: Недопустимое значение третьего аргумента метода!
ВидЭлементов - тип: Строка. Вид справочника для иерархического включения элементов или вид плана счетов для иерархического включения счетов. Если параметр не указан, иерархического включения не происходит.

Напиши, что здесь не так? ВыбТовары и ВыбСклад - списки значений, в список ВыбТовары можно в подборе добавлять и группы и элементы.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #17 - 29. Октября 2012 :: 11:31
Печать  
1. Запрос.УложитьСписокОбъектов(ВыбТовары, "#ВТТовары", "Номенклатура");
2.  (Фирма, Товар, Склад) заменить на  (Товар, Склад), не нужно там лишнее поле, раз ты в селект листе его не выбираешь потом
3.   in #ВТТовары
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #18 - 29. Октября 2012 :: 11:41
Печать  
Процедура ОстаткиТоваров()
     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     Запрос = СоздатьОбъект("ODBCRecordset"); Запрос.Отладка(Отладка);
     
   Запрос.УложитьСписокОбъектов(ВыбТовары,"#ВТТовары","Номенклатура"); //
     Запрос.УложитьСписокОбъектов(ВыбСклад, "#ВТСклады","МестаХранения"); //Справочник

     ТекстЗапроса="
     |      SELECT  
     |        РегОстатки.Товар as      идТовар,
     |            РегОстатки.Склад as идСклад,
     |            РегОстатки.ОстатокТовараОстаток as Остаток
   |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~, ,
     |                               (Товар in #ВТТовары) AND (Склад IN #ВТСклады),    
       |                               (Товар, Склад), (ОстатокТовара)) as РегОстатки";
       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   ТЗ_OUT.Загрузить(ТЗ);
КонецПроцедуры

message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '#ВТТовары'.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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

(Товар in  (select val from #ВТТовары))  .... и т.д
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #21 - 29. Октября 2012 :: 11:46
Печать  
Vlad7131 писал(а) 29. Октября 2012 :: 11:44:
Уж вроде проще некуда, прямо мини-запрос, а все равно не работает,
Вот и пойми как с этой укладкой в список быть.


дык доку читать перед применением , там усё есть.. и в FAQ тоже
Улыбка
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #22 - 29. Октября 2012 :: 11:57
Печать  
Ура, сработало, вот только с пустым списком складов вышло 0 строк,
а как условие по складам убрал, то вышло все.
Если не выбрано ничего в список товаров - т.е. по Всем товарам,
или в склады - По Всем складам, то как здесь написать:
(Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады))
или просто текст запроса менять,убрать условие если ВыбТовар пустой?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #23 - 29. Октября 2012 :: 12:01
Печать  
если уж тебе нужно видеть все строки со всеми товарами и складами из фильтра - то это НЕ ВСЕ вошедшие в запрос, если что.

Если уж очень хочется, то ВТ + union all
(select t1.val, t2.val,0 from #табличкаСТоваром,#табличкаCоСкладами)
ну и гроуп бай потом

Вот это не понял, что есть ВТ,t1,t1, можно запрос простенький?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #24 - 29. Октября 2012 :: 12:11
Печать  
[quote author=Vlad7131 link=1350469685/15#22 date=1351511852]Ура, сработало, вот только с пустым списком складов вышло 0 строк,
а как условие по складам убрал, то вышло все.
Если не выбрано ничего в список товаров - т.е. по Всем товарам,
или в склады - По Всем складам, то как здесь написать:
(Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады))
или просто текст запроса менять,убрать условие если ВыбТовар пустой?[/quote]

проще писать так:

заместо
(Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады))

втыкаешь (1=1 and 2=2)

далее, если список есть,то

ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"1=1"," (Товар in (select val from #ВТТовары))");
и т.д

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #25 - 29. Октября 2012 :: 12:20
Печать  
Vlad7131 писал(а) 29. Октября 2012 :: 12:01:
если уж тебе нужно видеть все строки со всеми товарами и складами из фильтра - то это НЕ ВСЕ вошедшие в запрос, если что.

Если уж очень хочется, то ВТ + union all
(select t1.val, t2.val,0 from #табличкаСТоваром,#табличкаCоСкладами)
ну и гроуп бай потом

Вот это не понял, что есть ВТ,t1,t1, можно запрос простенький?


так, примерно.. тока  в ВТ параметры подставь свои:


Код
Выбрать все
|select  
|     Таб.Товар [Товар $Справочник.Номенклатура],
|	Таб.Склад [Склад $Справочник.Склады],
|	sum(Таб.Остаток) Остаток
| from
|( SELECT  
|	РегОстатки.Товар Товар,
|	РегОстатки.Склад Склад,
|	РегОстатки.ОстатокТовараОстаток Остаток
|	FROM
|		$РегистрОстатки.ОстаткиТоваров (.......) as РегОстатки
|	 Union all
| SELECT  
|	Р1.Товар,
|	Р2.Склад,
|	0
|	FROM
|		$РегистрОстатки.ОстаткиТоваров (.......) as Р1,$РегистрОстатки.ОстаткиТоваров (.......) as Р2 ) Таб
|Group by Таб.Товар,Таб.Склад  














  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #27 - 29. Октября 2012 :: 12:27
Печать  
только having выкинуть еще - тоды будет все вошедшие в запрос, а не только те, по которым есть останки..
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #28 - 29. Октября 2012 :: 12:30
Печать  
Тут 3 ВТ с тремя алиасами: as РегОстатки, as Р1 и as Р2,
параметры в них одни и те же подставлять? Как и в старом запросе:
     $РегистрОстатки.ОстаткиТоваров(:ДатаКон~, ,
     |                              (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
       |                               (Товар, Склад), (ОстатокТовара))
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #29 - 29. Октября 2012 :: 12:32
Печать  
да.
Не боись, скуль не тупой ..он выполнит этот запрос 1 раз.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #30 - 29. Октября 2012 :: 12:38
Печать  
Собрался выкинуть having, скопировал в буфер, вставил в management studio,
Invalid object name '#ВТТовары'.
Парсер не переводит в понятное для sql имя #ВТТовары:
(ra99_vt.sp101 in (select val from #ВТТовары))

А в 1С-ке все работает.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #31 - 29. Октября 2012 :: 12:42
Печать  
Может вставить переведенный парсером текст запроса вместо старого текста запроса в 1С отчет, убрать having и  пройдет?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #33 - 29. Октября 2012 :: 12:49
Печать  
Vlad7131 писал(а) 29. Октября 2012 :: 12:42:
Может вставить переведенный парсером текст запроса вместо старого текста запроса в 1С отчет, убрать having и  пройдет?


Можешь пока и не убирать having, думаю, тебе при конОст этого не нужно совсем.
А так, убирается просто - обрМетаsql  имеем текст запроса, из него стрзаменить и скармливаем в выполнитьинструкию..



  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #34 - 29. Октября 2012 :: 12:53
Печать  
А что такое обрМетаsql ? Это метод такой есть?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #35 - 29. Октября 2012 :: 12:55
Печать  
уже нашел.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #36 - 30. Октября 2012 :: 04:29
Печать  
Запрос выдает ошибку:][SQL Server]Incorrect syntax near '20121016Z'.
Я уже стал пробовать его частями запускать, все равно.
Это в 1С:
| SELECT  
|      Р1.Товар,
|      Р2.Склад,
|      0
|      FROM
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as Р1,
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as Р2";
А это после парсинга:
SELECT  
     Р1.Товар,
     Р2.Склад,
     0
     FROM
           (
select
rg99_vt.sp3603 as Фирма,
rg99_vt.sp101 as Товар,
rg99_vt.sp100 as Склад,
rg99_vt.sp102 as ОстатокТовараОстаток
from rg99 as rg99_vt (nolock)
where rg99_vt.period={d '2012-10-01'}
and (
rg99_vt.sp102 <> 0
)
) as Rests99('20121016Z', ,
                              (Фирма='     0   ') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
                              (Товар, Склад), (ОстатокТовара)) as Р1,
           (
select
rg99_vt.sp3603 as Фирма,
rg99_vt.sp101 as Товар,
rg99_vt.sp100 as Склад,
rg99_vt.sp102 as ОстатокТовараОстаток
from rg99 as rg99_vt (nolock)
where rg99_vt.period={d '2012-10-01'}
and (
rg99_vt.sp102 <> 0
)
) as Rests99('20121016Z', ,
                              (Фирма='     0   ') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
                              (Товар, Склад), (ОстатокТовара)) as Р2
...[SQL Server]Incorrect syntax near '20121016Z'.
Какие то странные алиасы Rests99, да еще 2 одинаковых.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #37 - 30. Октября 2012 :: 04:42
Печать  
Eprst писал(а) 29. Октября 2012 :: 12:27:
только having выкинуть еще - тоды будет все вошедшие в запрос, а не только те, по которым есть останки..


Сомнительный совет, ибо дает непрогнозируемое поведение.
Наличие строк с нулевым остатком в табличке регистров есть небольшой артефакт, связанный с оптимизацией алгоритма пересчета итога.
И в какой-то момент, без всякого изменения данных, их может не стать (емнип, полный пересчет итогов их вынесет, например).
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #38 - 30. Октября 2012 :: 05:08
Печать  
Satans Claws писал(а) 30. Октября 2012 :: 04:42:
емнип, полный пересчет итогов их вынесет, например.


Нифига подобного.
Разве что выгрузка-загрузка, либо явное удаление таблички итогов и пересчет их.

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #39 - 30. Октября 2012 :: 05:13
Печать  
[quote author=Vlad7131 link=1350469685/30#36 date=1351571357]Запрос выдает ошибку:][SQL Server]Incorrect syntax near '20121016Z'.

Какие то странные алиасы Rests99, да еще 2 одинаковых.
[/quote]

[quote]period={d '2012-10-01'} ?[/quote]

?

ты каким объектом запрос то делаешь ?
больше кода.
На счет алиясов - там всё правильно

  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #40 - 30. Октября 2012 :: 05:34
Печать  
Запрос = СоздатьОбъект("ODBCRecordset");
   ТекстЗапроса="        
|select  
|     Таб.Товар [Товар $Справочник.Номенклатура],
|      Таб.Склад [Склад $Справочник.МестаХранения],
|      sum(Таб.Остаток) Остаток
| from
|( SELECT  
|      РегОстатки.Товар Товар,
|      РегОстатки.Склад Склад,
|      РегОстатки.ОстатокТовараОстаток Остаток
|      FROM
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, , ,
|                               (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as РегОстатки
|       Union all
| SELECT  
|      Р1.Товар,
|      Р2.Склад,
|      0
|      FROM
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|                               (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as Р1,
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|                               (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as Р2";
) Таб
|Group by Таб.Товар,Таб.Склад";  
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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

Код
Выбрать все
|		$РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|					 (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),
|					 (Товар, Склад), (ОстатокТовара)) as Р2";
) Таб
 


убери ЭТО
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #42 - 30. Октября 2012 :: 07:18
Печать  
Это я комментировал, чтобы получить меньший запрос и потом забыл убрать,
Все равно та же ошибка:SQL Server]Incorrect syntax near '20121016Z'.
ТекстЗапроса="        
|select  
|     Таб.Товар [Товар $Справочник.Номенклатура],
|      Таб.Склад [Склад $Справочник.МестаХранения],
|      sum(Таб.Остаток) Остаток
| from
|( SELECT  
|      РегОстатки.Товар Товар,
|      РегОстатки.Склад Склад,
|      РегОстатки.ОстатокТовараОстаток Остаток
|      FROM
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, , ,
//|                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as РегОстатки
|       Union all
| SELECT  
|      Р1.Товар,
|      Р2.Склад,
|      0
|      FROM
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as Р1,
|            $РегистрОстатки.ОстаткиТоваров (:ДатаКон~, ,
|                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
|                               (Товар, Склад), (ОстатокТовара)) as Р2
|) Таб
|Group by Таб.Товар,Таб.Склад";  
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #43 - 30. Октября 2012 :: 07:20
Печать  
Т.е. где то здесь:
select
rg99_vt.sp3603 as Фирма,
rg99_vt.sp101 as Товар,
rg99_vt.sp100 as Склад,
rg99_vt.sp102 as ОстатокТовараОстаток
from rg99 as rg99_vt (nolock)
where rg99_vt.period={d '2012-10-01'}
and (
rg99_vt.sp102 <> 0
)
) as Rests99('20121016Z', ,
                              (Фирма='     0   ') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
                              (Товар, Склад), (ОстатокТовара)) as Р1,
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #44 - 30. Октября 2012 :: 07:26
Печать  
Код
Выбрать все
|		$РегистрОстатки.ОстаткиТоваров (:ДатаКон~,,
|					 (Фирма=$ПустойИД) AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),  

 

Запрос.Отладка(1)

что возвращает ?

1cpp какой версии у тебя ?
в Меню-Помощь-О программе, что светится ?



  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #45 - 30. Октября 2012 :: 07:37
Печать  
Раньше версия 2.5.8 стояла, стал подключать RIK_dll, взял из
архива и 1СРР, сейчас стоит 3.0.1.22
Отладка возвращает:
select  
    Таб.Товар [Товар $Справочник.Номенклатура],
     Таб.Склад [Склад $Справочник.МестаХранения],
     sum(Таб.Остаток) Остаток
from
( SELECT  
     РегОстатки.Товар Товар,
     РегОстатки.Склад Склад,
     РегОстатки.ОстатокТовараОстаток Остаток
     FROM
           (
select
rg99_vt.sp3603 as Фирма,
rg99_vt.sp101 as Товар,
rg99_vt.sp100 as Склад,
rg99_vt.sp102 as ОстатокТовараОстаток
from rg99 as rg99_vt (nolock)
where rg99_vt.period={d '2012-10-01'}
and (
rg99_vt.sp102 <> 0
)
) as Rests99('20121016Z', , ,
                              (Товар, Склад), (ОстатокТовара)) as РегОстатки
      Union all
SELECT  
     Р1.Товар,
     Р2.Склад,
     0
     FROM
           (
select
rg99_vt.sp3603 as Фирма,
rg99_vt.sp101 as Товар,
rg99_vt.sp100 as Склад,
rg99_vt.sp102 as ОстатокТовараОстаток
from rg99 as rg99_vt (nolock)
where rg99_vt.period={d '2012-10-01'}
and (
rg99_vt.sp102 <> 0
)
) as Rests99('20121016Z', ,
                              (Фирма='     0   ') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
                              (Товар, Склад), (ОстатокТовара)) as Р1,
           (
select
rg99_vt.sp3603 as Фирма,
rg99_vt.sp101 as Товар,
rg99_vt.sp100 as Склад,
rg99_vt.sp102 as ОстатокТовараОстаток
from rg99 as rg99_vt (nolock)
where rg99_vt.period={d '2012-10-01'}
and (
rg99_vt.sp102 <> 0
)
) as Rests99('20121016Z', ,
                              (Фирма='     0   ') AND (Товар in (select val from #ВТТовары)) AND (Склад in (select val from #ВТСклады)),    
                              (Товар, Склад), (ОстатокТовара)) as Р2
) Таб
Group by Таб.Товар,Таб.Склад
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{C:\DB.ADM\PV\НЕ_РАБ_ВЕРСИИ\TEST_QUERY_УЛОЖИТЬСПИСОК2.ERT(77)}: State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '20121016Z'.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #46 - 30. Октября 2012 :: 07:41
Печать  
Сейчас вернул версию 2.5.8
попробовал, та же петрушка:
SQL Server Driver][SQL Server]Incorrect syntax near '20121016Z'.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

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



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

Вот, для типовой ТиС усё работает:
Код
Выбрать все
//*******************************************
Процедура Сформировать()
	Запрос = СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса="
	|select
	|  Таб.Товар [Товар $Справочник.Номенклатура],
	|  Таб.Склад [Склад $Справочник.Склады],
	|  sum(Таб.Количество) Количество
	|  from
	|(
	| select
	|   РегОстатки.Номенклатура Товар,
	|   РегОстатки.Склад Склад,
	|   РегОстатки.КоличествоОстаток Количество
	| from
	|  $РегистрОстатки.ОстаткиТМЦ(:КонДата~,,,(Номенклатура,Склад),(Количество)) as РегОстатки
	| Union all
	| select
	|   Р1.Номенклатура,
	|   Р2.Склад,
	|   0
	| from
	|  $РегистрОстатки.ОстаткиТМЦ(:КонДата~,,,(Номенклатура,Склад),(Количество)) as Р1,
	|  $РегистрОстатки.ОстаткиТМЦ(:КонДата~,,,(Номенклатура,Склад),(Количество)) as Р2
	|) Таб
	|Group by Таб.Товар,Таб.Склад";
	Запрос.Отладка(1);
	Запрос.УстановитьТекстовыйПараметр("КонДата",ТекущаяДата());
	Запрос.ВыполнитьИнструкцию(ТекстЗапроса).ВыбратьСтроку();
КонецПроцедуры 


  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: ВСЕ Вошедшие в запрос для вывода товара с нулевым остатком на складе.
Ответ #49 - 30. Октября 2012 :: 10:37
Печать  
Спасибо, дружище!
Все заработало.
Это я похоже с запятыми перестарался
"$РегистрОстатки.ОстаткиТоваров (:ДатаКон~, , , Условие"
там должно быть 2 а не 3 запятые.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать