Имя: Пароль:
1C
1С v8
Разность полей в запросе
,
0 Double_Medved
 
24.01.13
14:04
Подскажите пожалуйста, вопрос простой, но что-то не выходит.. Как вычитать/складывать/перемножать поля в запросе? Вот например хочу вычесть одно поле из другого, но выходит пустое значение, ВЫРАЗИТЬ КАК Число тоже не помогает,поле Разница пустое, хотя вычитаемы поля заполнены:
ВЫБРАТЬ
   &Дата1 КАК Дата,
   ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
   ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
   ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура1,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.ВНаличииОстаток,
   ЦеныНоменклатурыСрезПоследних1.ВидЦены КАК ВидЦены1,
   ЦеныНоменклатурыСрезПоследних1.Номенклатура КАК Номенклатура2,
   ЦеныНоменклатурыСрезПоследних1.Цена КАК Цена1,
   ЦеныНоменклатурыСрезПоследних1.Цена - ЦеныНоменклатурыСрезПоследних.Цена КАК Разница
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних({(&Дата)}, ) КАК ЦеныНоменклатурыСрезПоследних,
   РегистрНакопления.ТоварыНаСкладах.Остатки({(&Дата)}, ) КАК ТоварыНаСкладахОстатки,
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних1
ГДЕ
   ТоварыНаСкладахОстатки.Склад = &Склад
   И ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены1
   И ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
   И ЦеныНоменклатурыСрезПоследних1.ВидЦены = &ВидЦены2
   И ЦеныНоменклатурыСрезПоследних1.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
1 Maxus43
 
24.01.13
14:06
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних({(&Дата)}, ) КАК ЦеныНоменклатурыСрезПоследних,
   РегистрНакопления.ТоварыНаСкладах.Остатки({(&Дата)}, ) КАК ТоварыНаСкладахОстатки,
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних1

расстрелять на месте.
2 Double_Medved
 
24.01.13
14:09
А, ну знаю что не красиво...., потом сделаю по-человечески
3 Double_Medved
 
24.01.13
14:10
Опа,  РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних1, тут дату не указал...
4 Domanoff26
 
24.01.13
14:11
(3) и нафиг тебе два одинаковых, или там разные даты?
5 Double_Medved
 
24.01.13
14:11
Все равно - я не понимаю, оба значения
ЦеныНоменклатурыСрезПоследних1.Цена - ЦеныНоменклатурыСрезПоследних.Цена КАК Разница
Заполнены, но не вычитаются... Знаю что ерундовый вопрос.. Не выходит блин, помогите плиз, только вычесть одно поле из другого осталось
6 Double_Medved
 
24.01.13
14:12
Там разные виды цен, типа закупочная и розничная
7 Maxus43
 
24.01.13
14:13
(2) это не некрасиво, это Кроссджойн 3-х таблиц. Не было бы ограничений в "ГДЕ" - платформа повесилась бы от негодования и общего расстройства психики. Юзай нормальные соединения таблиц
8 Domanoff26
 
24.01.13
14:13
чего то не понимаю, где твои соединения таблиц?
9 Domanoff26
 
24.01.13
14:14
вид цен указывай в параметрах
10 hhhh
 
24.01.13
14:14
(5) ну убери запятые и поставь СОЕДИНЕНИЕ между таблицами. Тогда может и вычтется.

Непонятно, что из чего ты вообще вычитаешь. Например в одном срезе 1000 записей, в другом две тысячи. Как все эти записи друг из друга вычтутся?
11 Domanoff26
 
24.01.13
14:15
(7) ЦеныНоменклатурыСрезПоследних1.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура , а ты скажешь что это за условие такое вместо соединения7
12 Kreont
 
24.01.13
14:16
да все как раз от того что нету соединения, см (8)(10).
У тебя в результате слева столбец цен, справа пусто, потом ниже наоборот
13 Maxus43
 
24.01.13
14:22
(11) не скажу, это имеет мало смысла
14 Double_Medved
 
24.01.13
14:24
Переписал чуть-чуть понятнее,надеюсь:
ВЫБРАТЬ
   &Дата1 КАК Дата,
   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура1,
   ТоварыНаСкладахОстатки.Склад,
   ТоварыНаСкладахОстатки.ВНаличииОстаток,
   ЦеныНоменклатурыСрезПоследнихЗакупочная.ВидЦены КАК ВидЦены,
   ЦеныНоменклатурыСрезПоследнихЗакупочная.Номенклатура КАК Номенклатура,
   ЦеныНоменклатурыСрезПоследнихЗакупочная.Цена КАК Цена,
   ЦеныНоменклатурыСрезПоследнихРозничная.ВидЦены КАК ВидЦены1,
   ЦеныНоменклатурыСрезПоследнихРозничная.Номенклатура КАК Номенклатура2,
   ЦеныНоменклатурыСрезПоследнихРозничная.Цена КАК Цена1,
   ЦеныНоменклатурыСрезПоследнихРозничная.Цена - ЦеныНоменклатурыСрезПоследнихЗакупочная.Цена КАК Разница
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних({(&Дата)}, ) КАК ЦеныНоменклатурыСрезПоследнихЗакупочная,
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних({(&Дата)}, ) КАК ЦеныНоменклатурыСрезПоследнихРозничная,
   РегистрНакопления.ТоварыНаСкладах.Остатки({(&Дата)}, ) КАК ТоварыНаСкладахОстатки
ГДЕ
   ТоварыНаСкладахОстатки.Склад = &Склад
   И ЦеныНоменклатурыСрезПоследнихЗакупочная.ВидЦены = &ВидЦены1
   И ЦеныНоменклатурыСрезПоследнихРозничная.ВидЦены = &ВидЦены2
   И ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследнихЗакупочная.Номенклатура
   И ЦеныНоменклатурыСрезПоследнихРозничная.Номенклатура = ЦеныНоменклатурыСрезПоследнихЗакупочная.Номенклатура
15 Domanoff26
 
24.01.13
14:25
(14)СОЕДИНЯЙ, пока чушь
16 Double_Medved
 
24.01.13
14:26
Вообщем он выбирает номенклатуру которая есть на складе, потом цены Закупочные и цены Розничные, выбирает там где одинаковая номенклатура,  я понимаю, код индусский. Но он все правильно выводит, Номенклатуру, Остатки, ЦенуЗакупочную и ЦенуРозничную..., только разность не делает
17 hhhh
 
24.01.13
14:33
(16) делает он разность, но как понимаешь, только в строчках, где обе цены есть. Ты проверяй не на первой странице отчета, а где-то начиная с 20-й страницы отчета разность должна появляться.
18 Domanoff26
 
24.01.13
14:35
на фиг писать, если не слушаешь никого
19 ssh2006
 
24.01.13
14:35
(16) брось хренью заниматься, сделай нормальный запрос, используй ЕСТЬNULL(), где необходимо
20 Double_Medved
 
24.01.13
14:54
Да я понимаю что соединять по Условию где Номенклатура = Номенклатура1 это некрасиво, Но он корректно все выводит, кроме этой разности. То есть в каждой строчке правильые количество и цены номенклатуры. Подскажите, как примерно соединять таблицы, вот например по этой Номенклатуре, просто я всегда использовал ГДЕ. Ну хоть на пальцах.
21 Maxus43
 
24.01.13
15:02
вот как соединять, без разницы цен

ВЫБРАТЬ
   ТоварыОрганизацийОстатки.Номенклатура,
   ТоварыОрганизацийОстатки.ХарактеристикаНоменклатуры,
   ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
   РегистрНакопления.ТоварыОрганизаций.Остатки(&дата, ) КАК ТоварыОрганизацийОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&дата, ТипЦен = &тип) КАК ЦеныНоменклатурыСрезПоследних
       ПО ТоварыОрганизацийОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
           И ТоварыОрганизацийОстатки.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
22 Maxus43
 
24.01.13
15:03
(20) ещё раз (7) прочитай, это НЕ НЕкрасиво, это просто неправильно. Кроссджойн - получается что-то типа соединения Всех полей Со Всеми полями других таблиц