Имя: Пароль:
1C
1С v8
Разность полей в запросе
,
0 kinazarov
 
02.07.13
17:28
Написал запрос, который будет использоваться для целевых списаний: на основании стандартного СписаниеТоваров будут вводится документы НазначениеЦелиСписания.
Написал такой запрос
ВЫБРАТЬ
   ПТС.Номенклатура,
   ПТС.Склад,
   ПТС.Качество,
   СУММА(ПТС.Количество) КАК ДокСумКоличество,
   СУММА(ПТС.Стоимость) КАК ДокСумСтоимость,
   ЦССЗ.СумК КАК НацеленноеКоличество,
   ЦССЗ.СумС КАК НацеленнаяСтоимость
ИЗ
   РегистрНакопления.ПартииТоваровНаСкладах КАК ПТС
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦС.Товар КАК Тов,
           СУММА(ЦС.Количество) КАК СумК,
           СУММА(ЦС.Стоимость) КАК СумС
       ИЗ
           РегистрНакопления.ЦелевыеСписания КАК ЦС
       ГДЕ
           ЦС.ДокументСписания = &РегДок
       
       СГРУППИРОВАТЬ ПО
           ЦС.Товар) КАК ЦССЗ
       ПО ПТС.Номенклатура = ЦССЗ.Тов
ГДЕ
   ПТС.Регистратор = &РегДок

СГРУППИРОВАТЬ ПО
   ПТС.Номенклатура,
   ПТС.Склад,
   ПТС.Качество,
   ЦССЗ.СумК,
   ЦССЗ.СумС

(ЦССЗ - это целевые списания субзапрос)

Запрос нормально выводит данные.
Но мне желательно получать не только количество и сумму из документа списания и документов нацеливания, а их разность. То есть нечто вроде
ДокСумКоличество-НацеленноеКоличество КАК НенацеленныйОстаток,
ДокСумСтоимость-НацеленнаяСтоимость КАК НенацеленныйОстаток
в списке полей запроса.
1 Maxus43
 
02.07.13
17:29
что мешает?
2 Maxus43
 
02.07.13
17:30
запросы поддерживают арифмитические операции, и даже конкатенацию строковых
3 kinazarov
 
02.07.13
17:32
При вылавливании NULL-значений не получается
4 ДенисЧ
 
02.07.13
17:33
(3) Открой для себя силу ЕСТЬNULL, юный падаван!
5 kinazarov
 
02.07.13
17:34
Тогда не работает разность
6 ДенисЧ
 
02.07.13
17:35
(5) Кажется, кто-то тут уже переутомился...
7 Maxus43
 
02.07.13
17:37
ЕСТЬNULL(Поле1,0) - ЕСТЬNULL(Поле2,0)
8 kinazarov
 
02.07.13
17:37
Вот, например, результат вывода
http://rghost.ru/47165342
Выделенное поле - нулевое, хотя видно, что вычитаемое больше нуля
9 Галахад
 
гуру
02.07.13
17:43
(8) Не. Не видно.
10 kinazarov
 
02.07.13
17:43
Вот еще раз то же самое с полным текстом запроса и выводом его данных
http://rghost.ru/47165497

Подскажите, почему разность не считается?
11 Галахад
 
гуру
02.07.13
17:46
Убери группировку и сравни.
12 kinazarov
 
02.07.13
17:47
Галахад, специально для тебя:
Вон там внизу в выводе поле ДокСумКоличество для масленки равно 4. Поле СумК равно 2. А их разность - нулю.
Вот как так?
13 kinazarov
 
02.07.13
17:48
без группировки агрегатное поле (суммы) невозможно сосчитать
14 Галахад
 
гуру
02.07.13
17:49
(13) Зато можно увидеть, что разность считается.
15 kinazarov
 
02.07.13
17:52
Не видно же ничего кроме ошибки, вот пруф
http://rghost.ru/47165707
16 Ёпрст
 
02.07.13
17:53
Группировка по разности и числовым колонкам - зачёт
Отсыпь, а ?
17 Ёпрст
 
02.07.13
17:54
(15) Может всё же, агрегатные функции будешь применять в селект листе при группировке ?
18 kinazarov
 
02.07.13
17:55
Ёпрст подскажи как правильно сделать, а?
19 Ёпрст
 
02.07.13
17:59
(18)

Сумма(ПТС.Количество)-Сумма(ЕстьNULL(ЦССЗ.СумК,0)) КАК Вася
....
20 kinazarov
 
02.07.13
18:20
Мысль ясна. Попробовал как ты говоришь.
Только тогда запрос суммы неверно считает
например, когда  в документе списания в товарной части есть
номенклатура1 количествономенклатурымало сумманоменклатурымало
номенклатура2 количествономенклатуры2 сумманоменклатуры2
номенклатура1 количествономенклатурымного сумманоменклатурымного

и в документе назначениесписания есть
номенклатура1 назначение1 количествономенклатуры11 сумманоменклатуры11
номенклатура1 назначение2 количествономенклатуры22 сумманоменклатуры22
номенклатура2 назначение1 количествономенклатуры21 сумманоменклатуры1

то выходит задвоение
21 kinazarov
 
02.07.13
18:25
вот сырые данные без агрегатов
http://rghost.ru/47166460
как правильно сделать эту разность сумм?
22 kinazarov
 
02.07.13
18:28
в итоге мне в субзапросе нужно все равно суммировать по каждой номенклатуре количество и сумму.
но и во внешнем запросе ее нужно суммировать
а первоначальный код, в котором так и сделано, не дает посчитать разность
23 kinazarov
 
02.07.13
18:33
Вот табличные части документов-регистраторов
http://rghost.ru/47166675
24 kinazarov
 
02.07.13
18:55
Вот так вроде работает, но все равно чувствую себя индусом



ВЫБРАТЬ
   ПТС.Номенклатура,
   СУММА(ПТС.Количество) КАК ДокКоличество,
   СУММА(ПТС.Стоимость) КАК ДокСтоимость,
   СУММА(ПТС.Количество) - ЕСТЬNULL(ЦССЗ.Колво, 0) КАК ОстатокКоличество,
   СУММА(ПТС.Стоимость) - ЕСТЬNULL(ЦССЗ.Стоим, 0) КАК ОстатокСтоимость
ИЗ
   РегистрНакопления.ПартииТоваровНаСкладах КАК ПТС
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦС.Товар КАК Тов,
           СУММА(ЦС.Количество) КАК Колво,
           СУММА(ЦС.Стоимость) КАК Стоим
       ИЗ
           РегистрНакопления.ЦелевыеСписания КАК ЦС
       ГДЕ
           ЦС.ДокументСписания = &РегДок
       
       СГРУППИРОВАТЬ ПО
           ЦС.Товар) КАК ЦССЗ
       ПО ПТС.Номенклатура = ЦССЗ.Тов
ГДЕ
   ПТС.Регистратор = &РегДок

СГРУППИРОВАТЬ ПО
   ПТС.Номенклатура,
   ЦССЗ.Колво,
   ЦССЗ.Стоим
Основная теорема систематики: Новые системы плодят новые проблемы.