Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Не получается правильно написать запрос (число прочтений - 1682 )
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Не получается правильно написать запрос
20. Декабря 2010 :: 09:30
Печать  
Введение:
имеется документ "ЗаявкаПокупателя" в табличной части 3 реквизита (остальные не интересны):
1. УчитыватьИзделиямиВкл - число 0 или 1
2. Номенклатура - Справочник.Номенклатура
3. Количество - число
У справочника Номенклатура есть реквизиты:
1. Объем - число
2. ВидНоменклатуры - Перечисление.ВидыНоменклатуры
3. Комплектуется - число 0 или 1

Нужно получить итоговый Объем документа без услуг и работ, но по условию:
если в табл. части УчитыватьИзделиями=1 - объем по строке считаем
иначеесли Спр.Номенклатура.Комплектуется=0 - тогда объем по строчке тоже считаем

Вот запрос:
ТекстЗапроса = "
                 |SELECT
                 |      SUM($СпрН.Объем) as Объем
                 |FROM
                 |      $ДокументСтроки.ЗаявкаПокупателя as ДокС
                 |INNER JOIN
                 |      $Справочник.Номенклатура as СпрН ON СпрН.ID = $ДокС.Номенклатура AND
                 |                                                            $СпрН.ВидНоменклатуры <> :Услуга AND
                 |                                                            $СпрН.ВидНоменклатуры <> :Работа
                 |WHERE
                 |      ДокС.IDDOC = :ВыбДок AND
                 |      ($ДокС.УчитыватьИзделиямиВкл = 1 OR
                 |       ($ДокС.УчитыватьИзделиямиВкл = 0 AND
                 |        $СпрН.Комплектуется = 0))
                 |";
                       
                 глРС.УстановитьТекстовыйПараметр("ВыбДок",            парЗаявка);
                 глРС.УстановитьТекстовыйПараметр("Услуга",            Перечисление.ВидыНоменклатуры.Услуга);
                 глРС.УстановитьТекстовыйПараметр("Работа",            Перечисление.ВидыНоменклатуры.Работа);
                 
                 РезОбъем = глРС.ВыполнитьСкалярный(ТекстЗапроса);

но этот запрос возвращает объем без учета кол-ва товара в табличной части.

Если в SELECT добавить $ДокС.Количество и умножить на объем, то 1С++ ругается что такого поля нет.

Уже пробовал по всякому - никак не получается.
Где я ошибаюсь?
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Не получается правильно написать запрос
Ответ #1 - 20. Декабря 2010 :: 09:47
Печать  
Если реквизит табличной части действительно количество, то
SUM($СпрН.Объем * $ДокС.Количество) as Объем
должно работать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не получается правильно написать запрос
Ответ #2 - 20. Декабря 2010 :: 09:47
Печать  
Так то есть ?
Код
Выбрать все
	|SELECT
	 |	SUM($ДокС.Количество) as Объем
	 |FROM
	 |	$ДокументСтроки.ЗаявкаПокупателя as ДокС
	 |WHERE
	 |	ДокС.IDDOC = :ВыбДок
	 |"; 

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Не получается правильно написать запрос
Ответ #3 - 20. Декабря 2010 :: 09:58
Печать  
Действительно,
ТекстЗапроса = "
                 |SELECT
                 |      SUM($СпрН.Объем*$ДокС.Количество) as Объем
                 |FROM
                 |      $ДокументСтроки.ЗаявкаПокупателя as ДокС
                 |INNER JOIN
                 |      $Справочник.Номенклатура as СпрН ON СпрН.ID = $ДокС.Номенклатура AND
                 |                                                            $СпрН.ВидНоменклатуры <> :Услуга AND
                 |                                                            $СпрН.ВидНоменклатуры <> :Работа
                 |WHERE
                 |      ДокС.IDDOC = :ВыбДок AND
                 |      ($ДокС.УчитыватьИзделиямиВкл = 1 OR
                 |       ($ДокС.УчитыватьИзделиямиВкл = 0 AND
                 |        $СпрН.Комплектуется = 0))
                 |";
                       
                 глРС.УстановитьТекстовыйПараметр("ВыбДок",            парЗаявка);
                 глРС.УстановитьТекстовыйПараметр("Услуга",            Перечисление.ВидыНоменклатуры.Услуга);
                 глРС.УстановитьТекстовыйПараметр("Работа",            Перечисление.ВидыНоменклатуры.Работа);
                 
                 Рез = глРС.ВыполнитьСкалярный(ТекстЗапроса);

работает и дает правильные результаты, видимо нужно мозгу дать отдохнуть.
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Не получается правильно написать запрос
Ответ #4 - 20. Декабря 2010 :: 10:56
Печать  
Еще вопрос:
а если реквизит "Объем" находится в Справочник.Единицы
а у номенклатуры есть реквизит БазоваяЕдиница этого же типа
как тогда?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Не получается правильно написать запрос
Ответ #5 - 20. Декабря 2010 :: 11:03
Печать  
select

$СпрЕд.Объем
.........

left join $Справочник.Единицы as СпрЕд on СпрЕд.id = $СпрН.БазоваяЕдиница
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Не получается правильно написать запрос
Ответ #6 - 20. Декабря 2010 :: 11:15
Печать  
Eprst

Да, работает, спасибо
А я inner join  писал, а нужен был left
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать