|
Выбрать цены | ☑ | ||
---|---|---|---|---|
0
Альбатрос
17.04.12
✎
05:14
|
УТ10.3, 8.2.
ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничные"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 | ЦеныНоменклатурыСрезПоследних.Номенклатура, | ЦеныНоменклатурыСрезПоследних.Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних |ГДЕ | ЦеныНоменклатурыСрезПоследних.ТипЦен.Ссылка = &ТипЦен"; Запрос.УстановитьПараметр("ТипЦен", ТипЦен); Рез = Запрос.Выполнить().Выбрать(); Таким запросом получаю позиции, где указана розничная цена. Но для каждой найденной в этом же регистре надо посмотреть еще и оптовую. Как это сделать в одном запросе? Заранее спасибо |
|||
1
Cube
17.04.12
✎
05:22
|
(0) Ну, я вижу два варианта:
1). В параметр &ТипЦен передавать список типов цен, а в запросе сделать поля "ЦенаОптовая" и "ЦенаРозничная". В эти поля данные попадают по условию от типа цены, если условие не выполняется, то подставляется ноль. Потом запрос сгруппировать и цены взять максимальные. 2). Сделать запрос с двумя вложенными запросами. Оба вложенных запроса, как в (0). Первый выбирает розничную цену, второй оптовую. Связать вложенные запросы левым соединением. |
|||
2
Cube
17.04.12
✎
05:23
|
+(1) Я бы сделал вариантом 2.
|
|||
3
Альбатрос
17.04.12
✎
05:24
|
(2)Ок, щас попробую второй вариант
|
|||
4
DosBot
17.04.12
✎
05:35
|
или вот ещё вариант:
ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена, 0 КАК ОптоваяЦена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипРозничная)) КАК ЦеныНоменклатурыСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, 0, ЦеныНоменклатурыСрезПоследних.Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипОптовая)) КАК ЦеныНоменклатурыСрезПоследних |
|||
5
Cube
17.04.12
✎
05:37
|
(4) В одной строке у тебя не будет и розничной и оптовой. Нужно ещё группировать и в итоге, это получится вариация варианта 1 из поста (1).
|
|||
6
Cube
17.04.12
✎
05:39
|
(0) Кстати, за строку ГДЕ ЦеныНоменклатурыСрезПоследних.ТипЦен.Ссылка = &ТипЦен" тебя расстреляют без суда и следствия. Используй параметры виртуальной таблицы, это на порядок производительней.
|
|||
7
DosBot
17.04.12
✎
05:39
|
(5) миль пардон:
ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена, 0 КАК ОптоваяЦена ПОМЕСТИТЬ Данные ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипРозничная)) КАК ЦеныНоменклатурыСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, 0, ЦеныНоменклатурыСрезПоследних.Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипОптовая)) КАК ЦеныНоменклатурыСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные.Номенклатура, СУММА(Данные.РозничнаяЦена) КАК РозничнаяЦена, СУММА(Данные.ОптоваяЦена) КАК ОптоваяЦена ИЗ Данные КАК Данные СГРУППИРОВАТЬ ПО Данные.Номенклатура |
|||
8
Cube
17.04.12
✎
05:42
|
(7) Ещё и временные таблицы сюда запихал))) Мде)))
|
|||
9
Web00001
17.04.12
✎
05:50
|
Не так давно надо было подучить остатки на складе, оптовую и розничную цены, сделал как вышло мб не оптимально и еще какая нить хрень, в общем получилось три вложенных запроса:
ВЫБРАТЬ Товары.Ссылка, Цены.ЗакупочнаяЦена, Цены.РозничнаяЦена, Остатки.КоличествоОстаток, Товары.Артикул ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Товары.Ссылка КАК Ссылка, ТоварыОрганизацийОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки ПО (ТоварыОрганизацийОстатки.Номенклатура = Товары.Ссылка)) КАК Остатки ПО Товары.Ссылка = Остатки.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Закупочная.Номенклатура КАК Товар, Закупочная.Цена КАК ЗакупочнаяЦена, Розничная.Цена КАК РозничнаяЦена ИЗ (ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена КАК Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних ГДЕ ЦеныНоменклатурыСрезПоследних.ТипЦен = &ЦенаРозничная) КАК Розничная ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена КАК Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних ГДЕ ЦеныНоменклатурыСрезПоследних.ТипЦен = &ЦенаЗакупочная) КАК Закупочная ПО Розничная.Номенклатура = Закупочная.Номенклатура) КАК Цены ПО Товары.Ссылка = Цены.Товар.Ссылка |
|||
10
Web00001
17.04.12
✎
05:51
|
это запрос для отчета из СКД для 8.1
|
|||
11
Cube
17.04.12
✎
06:02
|
(9) Не позорился бы... За такой запрос нужно расстреливать.
Во-первых, ты не использовал параметры виртуальных таблиц для цен номенклатуры. Во-вторых, если у какого-либо товара будет установлена только одна цена, например, только оптовая, то такая номенклатура тебе в отчет вообще не попадает. В-третьих, а если умный бухгалтер переведет дату на компьютере на месяц-другой назад, то у тебя отчет и выдаст данные на дату, установленную на компе, ведь в запросе ты не говоришь, на какую дату получать данные... |
|||
12
Web00001
17.04.12
✎
06:30
|
Параметры да не использовал, позор моим седым яйцам... наверное :)
Во вторых попадала, были с пустыми ценами и розница и закупочная В третьих нет хитрых бухгалтеров, этот отчет формировался для анализа что и в каком количестве переедет в новую базу, то я его формировал. Но как то я считал, что если не указывать дату, то 1С должна указать актуальные остатки а не на дату, разве не? |
|||
13
Альбатрос
17.04.12
✎
06:59
|
Наваял вот такое произведение:
ТипРозничная = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничные"); ТипОптовая = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Оптовые"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Ном, | ЦеныНоменклатурыСрезПоследних.Цена КАК РозЦена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&ТипРозничная)) КАК ЦеныНоменклатурыСрезПоследнихРозничные |ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Цена КАК ОптЦена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен В (&ТипОптовая)) КАК ЦеныНоменклатурыСрезПоследнихОптовые |ПО ЦеныНоменклатурыСрезПоследнихОптовые.Номенклатура = Ном) |"; Рез = Запрос.Выполнить().Выбрать(); Пока рез.Следующий() цикл Сообщить(""+Рез.Номенклатура+" "+Рез.РозЦена+" "+Рез.ОптЦена); КонецЦикла; Ессесно, не работает. Что неправильно? |
|||
14
Cube
17.04.12
✎
06:59
|
(12) 2). Да, точно, там NULL у тебя будет, ошибся.
3). Точняк, выводится последняя запись регистра, даже, если её дата больше текущей. Почему-то считал по-другому... В этих пунктах я опарафинился)) Не ошибается тот, кто ничего не делает) |
|||
15
Cube
17.04.12
✎
07:11
|
(13) тебе вообще вложенные запросы делать не нужно. Я просто не обратил внимание, что в условии ГДЕ, ты тип цены указываешь, поэтому сказал, что вложенные запросы делать надо.
Твой запрос должен выглядеть так: ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура, ЦеныНоменклатурыСрезПоследних_Розничная.Цена КАК ЦенаРозничная, ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена, 0) КАК ЦенаОптовая ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ЦенаРозничная) КАК ЦеныНоменклатурыСрезПоследних_Розничная ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ЦенаОптовая) КАК ЦеныНоменклатурыСрезПоследних_Оптовая ПО ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура = ЦеныНоменклатурыСрезПоследних_Оптовая.Номенклатура |
|||
16
Альбатрос
17.04.12
✎
07:36
|
(15) Спасибо, такой вариант работает. Теперь нужно такое условие:
Если закупочная цена не заполнена (нужна закупочная, а не оптовая, я ошибся), тогда нужно выбрать последнюю стоимость по документу прихода. То есть, я так понимаю, из регистра партий. В этом случае уже понадобится вложенный запрос? |
|||
17
Cube
17.04.12
✎
07:43
|
(16) Нет, опять вложенный запрос не понадобится :)
Добавляешь нужный регистр, прикручиваешь его левым соединением к нашему регистру "ЦеныНоменклатурыСрезПоследних_Розничная", а потом в строке ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена, 0) КАК ЦенаОптовая пишешь так: ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена, ЕСТЬNULL(ТолькоЧтоДобавленныйРегистр.Стоимость, 0)) КАК ЦенаОптовая То есть этим ты задаешь условие: если есть оптовая цена, то выводится она, если её нет, то выводится стоимость из регистра "ТолькоЧтоДобавленныйРегистр", если и там данных нет, то выводится ноль. |
|||
18
Cube
17.04.12
✎
07:47
|
+(17) Хотя... Наверное придется всё же сделать вложенный запрос, для получения последней партии...
|
|||
19
Альбатрос
17.04.12
✎
08:19
|
(17) Спасибо еще раз, работает:
"ВЫБРАТЬ ПЕРВЫЕ 100 |ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура, |ЦеныНоменклатурыСрезПоследних_Розничная.Цена КАК ЦенаРозничная, |ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних_Оптовая.Цена,ЕСТЬNULL(ПартииТоваровНаСкладахОстатки_Стоимость.СтоимостьОстаток, 0)) КАК ЦенаОптовая | ИЗ |РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипРозничная) КАК ЦеныНоменклатурыСрезПоследних_Розничная | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипОптовая) КАК ЦеныНоменклатурыСрезПоследних_Оптовая | ПО ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура = ЦеныНоменклатурыСрезПоследних_Оптовая.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки_Стоимость | ПО ЦеныНоменклатурыСрезПоследних_Розничная.Номенклатура = ПартииТоваровНаСкладахОстатки_Стоимость.Номенклатура"; (18) Мне последняя запись и не нужна, потому что если нет закупочной цены, значит, через оприходование товар был занесен. В этом случае по средней нужна цена. Отсюда еще один вопрос: Мне из регистра партий нужно значение формулой вытащить, т.е. Стоимость/количество. Как эту формулу можно реалтзовать, чтоб результат подставлялся в "ЦенаОптовая"? |
|||
20
Cube
17.04.12
✎
09:24
|
(19) Ну так и пиши: "СтоимостьОстаток / КоличествоОстаток" Только учти, что количество может быть равно нулю и запрос будет вылетать с ошибкой "Деление на ноль". Поэтому используй условие ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ.
|
|||
21
Альбатрос
17.04.12
✎
09:33
|
(20) Огромное Вам спасибо, все получилось, очень помогли!
|
|||
22
Cube
17.04.12
✎
09:46
|
(21) Покажи, что получилось))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |