Имя: Пароль:
1C
1С v8
Запрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых
0 dimm7310
 
28.02.13
16:02
вроде простой запрос но не показывает цену

"ВЫБРАТЬ
                   | Таб.Номенклатура,
                   | Таб.Сумма,
                   | Таб.Количество,
                   | Таб.Скидка,
                   | ЦеныНоменклатурыПоставщиковСрезПервых.Соглашение.Партнер КАК Поставщик,
                   | ЦеныНоменклатурыПоставщиковСрезПервых.Цена * Таб.Количество КАК СуммаЗакуп
                   | ИЗ
                   | (ВЫБРАТЬ
                   |    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
                   |    ЗаказКлиентаТовары.КоличествоУпаковок КАК Количество,
                   |    ЗаказКлиентаТовары.Сумма КАК Сумма,
                   |    ЗаказКлиентаТовары.СуммаРучнойСкидки КАК Скидка
                   |ИЗ
                   |    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
                   |ГДЕ
                   |    ЗаказКлиентаТовары.Ссылка = &ТекЗаказ) Как Таб
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых(&ДатаД,) КАК ЦеныНоменклатурыПоставщиковСрезПервых
                   |        ПО (Таб.Номенклатура.Ссылка = ЦеныНоменклатурыПоставщиковСрезПервых.Номенклатура.Ссылка)                
                   |";

Если убрать фильтр по периоду, то выдаст дубли с ценами если у товара несколько цен от разных поставщиков.

Мне нужна одна цена - самая последняя.

Не могу сообразить. Что не так ?
1 lxndr
 
28.02.13
16:03
(0) Если
>> Мне нужна одна цена - самая последняя.
Тогда тебе нужен СрезПоследних
2 ХочуСказать
 
28.02.13
16:05
так отбор по поставщику задай...
какая цена должна быть если поставщиков несколько?
3 ХочуСказать
 
28.02.13
16:06
если просто первая попавшееся, то сделай свой срез
4 Serginio1
 
28.02.13
16:10
Попробуй выбрать первые, так как макс может выдавать одинаковую дату для нескольких документов
v8: запрос. найти посл. поступление!
5 Serginio1
 
28.02.13
16:10
4 смотри 91
6 GANR
 
28.02.13
16:23
Сразу в глаза бросилось:

1. ЦеныНоменклатурыПоставщиковСрезПервых по ЕСТЬNULL неплохо-бы проверять - в случае отсутствия записи в правой таблице запрос должен в ошибку вылететь.

2. А это что такое?
Таб.Номенклатура.Ссылка = ЦеныНоменклатурыПоставщиковСрезПервых.Номенклатура.Ссылка

как-нибудь так надо-бы: сгруппировать правую таблицу по Номенклатуре перед соединением и...
Таб.Номенклатура = СвернутыеЦеныНоменклатурыПоставщиковСрезПервых.Номенклатура
И Таб.Поставщик = СвернутыеЦеныНоменклатурыПоставщиковСрезПервых.Поставщик

А что вообще ДОЛЖЕН делать запрос ???
7 GANR
 
28.02.13
16:26
+(6) Первую попавшуюся цену что ли показывать? Что это за задачка такая?
8 ssh2006
 
28.02.13
16:28
(0) ВТ Срез тут не поможет тебе
9 GANR
 
28.02.13
16:32
Описание задачи запроса в студию.
10 dimm7310
 
28.02.13
16:35
(7) нужно получить ближайшую цену до указанной даты.

Если я хочу получить на дату = 22.02.13
т.е. у товара есть:
цена=100 р на 20.02.13 Поставщик1
цена=105 р на 19.02.13 Поставщик2
и
цена=110 р на 24.02.13 Поставщик1


то запрос должен вернуть цену=100
11 dimm7310
 
28.02.13
16:35
(5) попробую
12 ssh2006
 
28.02.13
16:36
(10) Поставщик вероятнее всего - измерение РС. Поэтому срез не даст последнее/первое значение по номенклатуре без учета поставщика, отсюда [ дубли с ценами если у товара несколько цен от разных поставщиков]
13 GANR
 
28.02.13
16:46
(10) Если в РС на одну дату 2 цены

цена=100 р на 20.02.13 Поставщик1
цена=105 р на 20.02.13 Поставщик2

какую брать?
14 dimm7310
 
28.02.13
16:48
(13) меньшую
15 ХочуСказать
 
28.02.13
16:50
(13) у него задача видимо в том, что бы найти наиболее выгодного продавца...

(14) к заказу сначала находит из таблицы цен, наиболее близкую дату...
затем соединяесь по ней получаешь поставщика и цену
16 lxndr
 
28.02.13
16:51
(14) а поставщик нужен?
17 GANR
 
28.02.13
17:02
(14) запрос нетривиальный, будет окно - сделаю
18 ХочуСказать
 
28.02.13
17:04
(17) запрос, как запрос...
наподобе среза последних на каждую дату документа,
не сложнее
19 Serginio1
 
28.02.13
17:39
(17) Запрос с выбрать первые с сортировкой по дате убыв,цена
и вхождением поставщика в подзапрос и в подзапросе условие на номенклатуру. Смотри 5
20 GANR
 
28.02.13
17:59
(0)(10)(17) Так?
ВЫБРАТЬ
   ТоварыВЗаказе.Номенклатура,
   ТоварыВЗаказе.Сумма,
   ТоварыВЗаказе.Количество,
   ТоварыВЗаказе.Скидка,
   ЕСТЬNULL(СрезПервыхДешевейших.Соглашение.Партнер, ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)) КАК Поставщик,
   ЕСТЬNULL(СрезПервыхДешевейших.Цена, 0) * ТоварыВЗаказе.Количество КАК СуммаЗакуп
ИЗ
   (ВЫБРАТЬ
       ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
       СУММА(ЗаказКлиентаТовары.КоличествоУпаковок) КАК Количество,
       СУММА(ЗаказКлиентаТовары.Сумма) КАК Сумма,
       СУММА(ЗаказКлиентаТовары.СуммаРучнойСкидки) КАК Скидка
   ИЗ
       Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
   ГДЕ
       ЗаказКлиентаТовары.Ссылка = &ТекЗаказ
   
   СГРУППИРОВАТЬ ПО
       ЗаказКлиентаТовары.Номенклатура) КАК ТоварыВЗаказе
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦеныСрезПервых.Период КАК Период,
           ЦеныСрезПервых.Соглашение КАК Соглашение,
           ЦеныСрезПервых.Номенклатура КАК Номенклатура,
           ЦеныСрезПервых.Цена КАК Цена
       ИЗ
           РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых(&ДатаД, ) КАК ЦеныСрезПервых
               ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                   ЦеныСрезПервых.Период КАК Период,
                   ЦеныСрезПервых.Номенклатура КАК Номенклатура,
                   МИНИМУМ(ЦеныСрезПервых.Цена) КАК Цена
               ИЗ
                   РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых(&ДатаД, ) КАК ЦеныСрезПервых
               
               СГРУППИРОВАТЬ ПО
                   ЦеныСрезПервых.Период,
                   ЦеныСрезПервых.Номенклатура) КАК МинимальныеЦены
               ПО ЦеныСрезПервых.Период = МинимальныеЦены.Период
                   И ЦеныСрезПервых.Номенклатура = МинимальныеЦены.Номенклатура
                   И ЦеныСрезПервых.Цена = МинимальныеЦены.Цена) КАК СрезПервыхДешевейших
       ПО ТоварыВЗаказе.Номенклатура = СрезПервыхДешевейших.Номенклатура
21 GANR
 
28.02.13
18:09
Сам не уверен в правильности (20), так как репрезентативных тестовых данных нет.
22 Serginio1
 
28.02.13
18:38
Помести свой запрос в таблицу и проиндексируй по дате и цене
ИНДЕКСИРОВАТЬ ПО
   Номенклатура,
   Дата,
   Цена

А потом выбирай

ВЫБРАТЬ
  втИндекс.Номенлатура КАК Номенлатура,
  втИндекс.Поставщик,
итд
ИЗ
   втИндекс КАК втИндекс
ГДЕ
   (втИндекс.Поставщик) В

          (ВЫБРАТЬ ПЕРВЫЕ 1
              док.Поставщик
           ИЗ
               втИндексКАК Док
           ГДЕ
          Док.Номенклатура=втИндекс.Номенлатура
           УПОРЯДОЧИТЬ ПО
               Док.Дата УБЫВ
               ,Док.Цена)
23 GANR
 
28.02.13
19:46
ВЫБРАТЬ
   ТоварыВЗаказе.Номенклатура,
   ТоварыВЗаказе.Сумма,
   ТоварыВЗаказе.Количество,
   ТоварыВЗаказе.Скидка,
   ЕСТЬNULL(СрезПервыхДешевейших.Соглашение.Партнер, ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)) КАК Поставщик,
   ЕСТЬNULL(СрезПервыхДешевейших.Цена, 0) * ТоварыВЗаказе.Количество КАК СуммаЗакуп
ИЗ
   (ВЫБРАТЬ
       ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
       СУММА(ЗаказКлиентаТовары.КоличествоУпаковок) КАК Количество,
       СУММА(ЗаказКлиентаТовары.Сумма) КАК Сумма,
       СУММА(ЗаказКлиентаТовары.СуммаРучнойСкидки) КАК Скидка
   ИЗ
       Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
   ГДЕ
       ЗаказКлиентаТовары.Ссылка = &ТекЗаказ
   
   СГРУППИРОВАТЬ ПО
       ЗаказКлиентаТовары.Номенклатура) КАК ТоварыВЗаказе
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЦеныСрезПервых.Период КАК Период,
           ЦеныСрезПервых.Соглашение КАК Соглашение,
           ЦеныСрезПервых.Номенклатура КАК Номенклатура,
           ЦеныСрезПервых.Цена КАК Цена
       ИЗ
           РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых(&ДатаД, ) КАК ЦеныСрезПервых
               ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                   ЦСП.Период КАК Период,
                   ЦСП.Номенклатура КАК Номенклатура,
                   МИНИМУМ(ЦСП.Цена) КАК Цена
               ИЗ
                   (ВЫБРАТЬ
                       ЦеныСрезПервых.Период КАК Период,
                       ЦеныСрезПервых.Номенклатура КАК Номенклатура,
                       ЦеныСрезПервых.Соглашение КАК Соглашение,
                       ЦеныСрезПервых.Цена КАК Цена
                   ИЗ
                       РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых(&ДатаД, ) КАК ЦеныСрезПервых) КАК ЦСП
               
               СГРУППИРОВАТЬ ПО
                   ЦСП.Период,
                   ЦСП.Номенклатура) КАК МинимальныеЦены
               ПО ЦеныСрезПервых.Период = МинимальныеЦены.Период
                   И ЦеныСрезПервых.Номенклатура = МинимальныеЦены.Номенклатура
                   И ЦеныСрезПервых.Цена = МинимальныеЦены.Цена) КАК СрезПервыхДешевейших
       ПО ТоварыВЗаказе.Номенклатура = СрезПервыхДешевейших.Номенклатура
24 dimm7310
 
01.03.13
10:23
Спасибо попробую оба варианта.
Мне в первую очередь важно, что бы это отрабатывало быстро , что бы двигаясь по заказам в динамическом списке в вспомогательной таблице отражалась разница цен реализации и закупа(это предварительный анализ пришедших заявок покупателей и небольшая неточность допустима - если обработка предложит не самую выгодную цену, все равно менеджер потом будет уточнять),  т.е. нужно просто получать послеюнюю запись цены закупа неважно какого поставщика
25 GANR
 
01.03.13
10:58
(24) имхо, (20) - заведомо неверный
26 Serginio1
 
01.03.13
11:17
(24) Это порочная практика. Нужно сразу делать один запрос с отбором накладных и номенклатур не попадающих в определенный диапазон наценок.
27 dimm7310
 
04.03.13
17:13
(23) к сожалению не работает, возвращает пустые цены. Похоже
РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПервых(&ДатаД, )

возвращает пустую таблицу
28 dimm7310
 
04.03.13
17:20
+(27) а если убрать параметр ДатаД - то работает, но нужно еще проверять какие он цены вытаскивает
29 dimm7310
 
04.03.13
17:29
+(27) но даже так задваивает если есть цены разных поставщиков
30 Serginio1
 
04.03.13
17:36
31 Serginio1
 
04.03.13
17:38
Используй комбинацию СрезПоследних и ВыбратьПервые как в 22 с использованием временных таблиц.
32 dimm7310
 
04.03.13
18:12
(31) хорошо попробую.
33 GANR
 
04.03.13
19:19
(32) У тебя на руках данные - разрежь запрос на запчасти и посмотри, что возвращает каждый подзапрос.
34 GANR
 
04.03.13
19:20
Надо добиться, чтобы СрезПервыхДешевейших не двоился