|
Получить запросом периоды действия цены | ☑ | ||
---|---|---|---|---|
0
Любопытная
24.06.14
✎
17:33
|
Здравствуйте.
Имеется таблица значений: Номенклатура, ДатаНачалаПериода, ДатаОкончанияПериода. И еще имеется регистр сведений ЦеныНоменклатуры, независимый, с периодичностью в день. Необходимо получить периоды действия цены номенклатуры за заданный период. Т.е. если период задан датами 01.06 - 30.06, а цена номенклатуры менялась 01.06 и 10.06, то в результате получится два периода 01.06-09.06 и 10.06-30.06. Очень хочется получить эту таблицу сразу в запросе, но никак не могу понять, как это сделать. Подкиньте идею, дорогие товарищи, будьте так любезны :) |
|||
1
dj_serega
24.06.14
✎
17:37
|
регламентированный календарь заполнен?
|
|||
2
Любопытная
24.06.14
✎
17:39
|
(1) Допустим, что он есть и заполнен. А зачем он?
|
|||
3
dj_serega
24.06.14
✎
17:58
|
(2) Хотя да :))) не туда подумал...
ВЫБРАТЬ ЦеныПродуктов.Период, ЦеныПродуктов.Цена, ЦеныПродуктов.Продукт ПОМЕСТИТЬ ВыборкаЦен ИЗ РегистрСведений.ЦеныПродуктов КАК ЦеныПродуктов ГДЕ ЦеныПродуктов.Период МЕЖДУ &НачалоПериода И &КонецПериода И ЦеныПродуктов.Продукт = &Продукт ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦеныПродуктовСрезПоследних.Период, ЦеныПродуктовСрезПоследних.Цена, ЦеныПродуктовСрезПоследних.Продукт ИЗ РегистрСведений.ЦеныПродуктов.СрезПоследних(&НачалоПериода, Продукт = &Продукт) КАК ЦеныПродуктовСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦеныПродуктовСрезПервых.Период, ЦеныПродуктовСрезПервых.Цена, ЦеныПродуктовСрезПервых.Продукт ИЗ РегистрСведений.ЦеныПродуктов.СрезПервых(&КонецПериода, Продукт = &Продукт) КАК ЦеныПродуктовСрезПервых ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВыборкаЦен.Период КАК Период, ВыборкаЦен.Цена, ВыборкаЦен.Продукт ИЗ ВыборкаЦен КАК ВыборкаЦен УПОРЯДОЧИТЬ ПО Период |
|||
4
Скай
24.06.14
✎
18:03
|
(3) И где в твоем запросе конец периода действия?
Последнюю таблицу нужно соединить саму с собой по условию ВыборкаЦен1.Период<ВыборкаЦен2.Период, И взять минимум по второму периоду. Вроде так, на вскидку. |
|||
5
dj_serega
24.06.14
✎
18:08
|
(4) Так конец периода это будет -1 секунда следующего периода :)
А такой запросец учили писать на курсах на спеца по платформе :) |
|||
6
Любопытная
24.06.14
✎
18:10
|
(3)Что-то тут не так. Мне нужно в конечной таблице поиметь Начало период, конец периода, цена.
Я могу получить все цены за период вместе с их датами регистрации, мне надо потом первоначально заданный период разбить на кусочки, согласно датам регистрации цен, и вот эта часть у меня не получается. Хотя может я вообще не в ту сторону думаю |
|||
7
Скай
24.06.14
✎
18:11
|
(5) То, что у тебя все отсортировано по порядку - это прекрасно, но ТС конкретно пишет, что таблицу требуемого вида(Ном, НачалоПериода, КонецПериода) нужно получить в запросе.
|
|||
8
Скай
24.06.14
✎
18:11
|
(6) в (4) же все написано
|
|||
9
Enders
24.06.14
✎
18:15
|
(0)
А получить таблицу Типа: Период,Номенклатура,Цена После чего сгруппировать по номенклатуре и цене и рассчитать Минимум(период) и Максимум(Период), вариант? Или у вас может быть заведен документ установки цен, а цена на товар не изменится? |
|||
10
Любопытная
24.06.14
✎
18:16
|
(7) Это мне страшно хочется получить все в запросе и не городить огороды с постобработкой результата. Но, если не получится, значит буду разбирать потом руками в цикле.
(8) Написала (6) до того, как прочитала (4). Всем спасибо, попробуем применить советы на практике :) |
|||
11
Любопытная
24.06.14
✎
18:18
|
(9) цены в регистр пишутся напрямую в регистр. Предположим, что они не повторяются, т.е. каждая запись несет в себе изменения.
Это не рабочая работа, это я учусь просто) Наткнулась на такую вот задачу, думала сделаю легко, а вот не получилось. Пришлось просить о помощи :) Спасибо за внимание и участие :) |
|||
12
Скай
24.06.14
✎
18:20
|
(9) И что даст твой запрос, если одна и та же цена была установлена на два разных периода? Оно сольет все в один?
|
|||
13
Enders
24.06.14
✎
18:22
|
(12) Да в один, по-этому я и уточнил.
|
|||
14
Скай
24.06.14
✎
18:23
|
(13) Ну так это не ситуация, когда есть установка цен, но цена не изменилась. Ситуацию
1 июня - 10 р 5 июня - 5 р 10 июня - 10 р тоже не корректно обработает |
|||
15
Enders
24.06.14
✎
18:28
|
(14) Туплю, не до конца продумал мысль)
Ну тогда как ты в (4) писал, соединить саму с собой по периоду и взять минимум. Просто я бы саму итоговую таблицу немного по другому получал. Хотя суть та же, согласен) |
|||
16
dj_serega
24.06.14
✎
18:35
|
(4) Это имел ввиду?
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВыборкаЦен.Период КАК Период, МИНИМУМ(ДОБАВИТЬКДАТЕ(ВыборкаЦен1.Период, СЕКУНДА, -1)) КАК КонецПериода, МАКСИМУМ(ВыборкаЦен.Цена) КАК Цена ИЗ ВыборкаЦен КАК ВыборкаЦен ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыборкаЦен КАК ВыборкаЦен1 ПО ВыборкаЦен.Период < ВыборкаЦен1.Период СГРУППИРОВАТЬ ПО ВыборкаЦен.Период УПОРЯДОЧИТЬ ПО Период |
|||
17
Любопытная
24.06.14
✎
18:39
|
(4) Это конечно замечательно, но по условиям задачи у меня не одна номенклатура и один период, а целая таблица с номенклатурами и периодами. В таком варианте СрезПервых и СрезПоследних использовать не получится, если только не добавить условия, что все периоды в ТЗ укладываются в один определенный период (к примеру месяц) и изначально брать изменения за месяц. В таком случае, все равно придется обрабатывать после запроса.
Выходит, мое желание собрать все в запросе невыполнимо :( Печаль |
|||
18
Любопытная
24.06.14
✎
18:41
|
ДА и вообще - поствила в параметрах период 15.06-30.06, а получила две записи регистра 01.06 и 23.06, т.е. те даты, в которые действительно менялась цена, к моим параметрам это не имеет никакого отношения :(
|
|||
19
Enders
24.06.14
✎
18:41
|
(17) Почему?) Выполнима
У тебя может быть как-то так Ном1 01.05.2014 31.05.2014 Ном2 15.05.2014 15.06.2014? |
|||
20
Скай
24.06.14
✎
18:42
|
Все выполнимо :)
|
|||
21
Enders
24.06.14
✎
18:43
|
(17) у тебя уже есть готовая ТЗ которую ты хочешь скормить запрос? Или эта ТЗ уже рассчитана в запросе и тебе требуется его дописать?
|
|||
22
Любопытная
24.06.14
✎
18:44
|
(19) Давайте считать, что в таблице может быть несколько записей по одной номенклатуре с разными периодами. Периоды по одной номенклатуре между собой не пересекаются, но укладываются в один месяц.
(21) Есть готовая ТЗ, которую я скармливаю в запрос. |
|||
23
Любопытная
24.06.14
✎
18:47
|
(20) Наверное. Но пока я не познала это Дао, для меня это что-то из области фантастики.
|
|||
24
Скай
24.06.14
✎
18:51
|
(23) Ключевой момент - это связь таблицы самой с собой по условию больше/меньше, с последующим получением максимального или минимального периода. Запросы как правило тяжелые получаются.
|
|||
25
Любопытная
24.06.14
✎
18:51
|
(19) Может быть так:
Ном1 01.06.2014 10.06.2014 Ном1 15.06.2014 25.06.2014 Ном2 01.06.2014 30.06.2014 На Ном1 цены устанавливались 25.05 - 100; 23.06 - 200; На Ном2 цены устанавливались 01.06 - 300; 10.06 - 150; В итоге надо получить таблицу Ном1 01.06 10.06 100 Ном1 15.06 22.06 100 Ном1 23.06 25.06 200 Ном2 01.06 09.06 300 Ном2 10.06 30.06 150 |
|||
26
Любопытная
24.06.14
✎
18:52
|
(24) Что значит Тяжелые - долго выполняются или для понимания сложные?
|
|||
27
Жан Пердежон
24.06.14
✎
19:00
|
(26) ничего нет там тяжелого, просто садишься и пишешь запрос
|
|||
28
Скай
24.06.14
✎
19:06
|
(26) Для выполнения на больших таблицах
|
|||
29
Enders
24.06.14
✎
19:08
|
(22) Ну в таком случае я б делал как-то так:
1. рассчитать период с Выбрать Минимум(ПериодС) Из &Тз как ТЗ 2. рассчитать период по Выбрать Максимум(периодПо) Из &Тз как ТЗ. Пункты 1 и 2 использовать как параметры для запроса 3. Перевел бы вашу таблицу в вид Период Номенклатура Товар Можно получить Запросом к производственному календарю Выбрать ТЗ.Номенклатура, ТЗ.ПериодС, ТЗ.ПериодПо Поместить Таб Из &Тз как ТЗ ; Выбрать Календарь.Период, Таб.номенклатура Поместить ДатыТовары Из РегистрСведений.ПроизводственныйКалендарь(или как он там) как Календарь Внутреннее соединение Таб как Таб По Календарь.Период >=Таб.ПериодС и Календарь.Период<=Таб.ПериодПо ; Выбрать ЦеныТоваровНаНачало.Период, ЦеныТоваровНаНачало.Номенклатура, ЦеныТоваровНаНачало.Цена Поместить ЦеныЗаПериод Из регистрСведений.ЦеныТоваров.СрезПоследних(КонецПериода(&НачалоПериода,День),Номенклатурав (Выбрать Различные ДатыТовар.Номенклатура из ДатыТовар)) как ЦеныТоваровНаНачало //НачалоПериода и КонецПериода это даты рассчитанные в 1,2 Объединить Всё Выбрать ЦеныТоваровЗаПериод.Период, ЦеныТоваровЗаПериод.Номенклатура, ЦеныТоваровЗаПериод.Цена Из регистрСведений.ЦеныТоваров как ЦеныТоваровЗаПериод Где Период Между НачалоПериода(ДобавитьКДате(&НачалоПериода,День,1),День) И КонецПериода(&КонецПериода) И Номенклатурав (Выбрать Различные ДатыТовар.Номенклатура из ДатыТовар) ; ВЫбрать ДатыТовар.Период, ДатыТовар.Номенклатура, Минимум(ЦеныЗаПериод.Период) как ПериодЦен Поместить АктуальныеДатыЦен Из ДатыТовар ЛевоеСоединение ЦеныЗаПериод По ДатыТовар.Период>=ЦеныЗаПериод.Период И ДатыТовар.Номенклатура = ЦеныЗаПериод.Номенклатура Сгруппировать ПО ДатыТовар.Период, ДатыТовар.Номенклатура ; выбрать АктуальныеДатыЦен.Период, АктуальныеДатыЦен.Номенклатура, актуальныеДатыЦен.ПериодЦен, Максимум(ЦеныЗаПериод.Цена) как Цена //Вдруг в 1 день 2 цены Поместить Итог Из АктуальныеДатыЦен Левое Соединение ЦеныЗаПериод По АктуальныеДатыЦен.ПериодЦен=ЦеныЗаПериод.период И АктуальныеДатыЦен.Номенклатура = ЦеныЗаПериод.Номенклатура Сгруппировать По АктуальныеДатыЦен.Период, АктуальныеДатыЦен.Номенклатура, актуальныеДатыЦен.ПериодЦен ; Выбрать Итог.Номенклутара, Итог.Цена, Минимум(Итог.Период) как ПериодС, Максимум(Итог1.Период)как ПериодПо Из Итог Левое Соединение Итог как Итог1 По Итог.Номенклатура = Итог1.Номенклатура И Итог.Период<Итог1.Период И Итог.ПериодЦен <>Итог1.ПериодЦен Сгруппировать По Итог.Номенклатура, Итог.Цена Кажется в конце не додумал, но проверить не могу) Или вообще бред написал) |
|||
30
Enders
24.06.14
✎
19:08
|
Блин, ещё и в теги не влезло)
|
|||
31
Любопытная
24.06.14
✎
19:42
|
(29) Т.е. что у нас получается:
1.Получаем первую и последнюю даты из всех периодов ТЗ, будем использовать их для ограничения по периодам. 2.Для каждой номенклатуры из ТЗ получаем запись с каждой датой из периода (используем для этого производственный календарь) 3.Получаем актуальные цены на каждую дату из таблицы п.2 4.Как-то собираем периоды обратно в кучу, соединяя для этого таблицу с самой собой. В итоге, как мне кажется, данные за весь месяц по каждой номенклатуре. От этого уже можно будет отталкиваться, выкидывая лишние периоды. Вроде умозрительно так, но делать сейчас уже не возьмусь - лучше с утра на свежую голову перед работой. (30) Спасибо большое. Всем остальным, принявшим участие в обсуждении, тоже спасибо :) Как приятно, что в мире так много умных и в тоже время добрых и отзывчивых людей :) |
|||
32
Enders
25.06.14
✎
14:07
|
(31) Суть вы уловили правильно ;)
Если несложно, отпишитесь о результатах. Просто интересно:) |
|||
33
Любопытная
25.06.14
✎
17:47
|
(32) Ничего толкового не вышло. Жаль. Сейчас об этом думать не хочу, соберу циклами все, что надо для дальнейшего решения задачи, с запросом как-нибудь в следующей жизни повоюю
|
|||
34
shuhard
25.06.14
✎
17:49
|
(33) слабак женского полу вероятно слабачка
|
|||
35
samozvanec
25.06.14
✎
18:05
|
(0) вот чето такое делал когда-то давно, но не помню точно, что и как. вроде надо соединить таблицу цен с таблицей периодов 4 раза - 2 раза по период регистрации больше даты начала, 2 раза меньше даты окончания, при этом по очереди брать даты - в первый раз вместо начала период регистрации, во второй - вместо конца. и потом как то это дело группировать и отбирать. попробуй)
|
|||
36
samozvanec
25.06.14
✎
18:08
|
(35) не, не так...
|
|||
37
Любопытная
25.06.14
✎
18:15
|
(34) Что дальше?
|
|||
38
Enders
25.06.14
✎
18:19
|
(33) А в чем проблема?
Итоговую таблицу вы получили? Проблема в соединении самой к себе или в чем? |
|||
39
Любопытная
25.06.14
✎
18:21
|
(38) Ерунду получила в итоговой таблице. Просто натурально ерунду. Запрос не сохранила, запостить не удастся)
Ну да, я слабак, признаю. Ну и ладно) |
|||
40
Wobland
25.06.14
✎
18:22
|
ВЫБРАТЬ
Документ1ТабличнаяЧасть1.Номенклатура, Документ1ТабличнаяЧасть1.ДатаС, Документ1ТабличнаяЧасть1.ДатаПо ПОМЕСТИТЬ ТЧ ИЗ Документ.Документ1.ТабличнаяЧасть1 КАК Документ1ТабличнаяЧасть1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.Цена, ЦеныНоменклатурыСрезПоследних.Период ПОМЕСТИТЬ ЦеныНаНачало ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( &ДатаС, Номенклатура В (ВЫБРАТЬ ТЧ.Номенклатура ИЗ ТЧ)) КАК ЦеныНоменклатурыСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.Цена, ЦеныНоменклатуры.Период ПОМЕСТИТЬ ИзмененияЦен ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.Период МЕЖДУ &ДатаС И &ДатаПо И ЦеныНоменклатуры.Номенклатура В (ВЫБРАТЬ ТЧ.Номенклатура ИЗ ТЧ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ИзмененияЦен.Период, ИзмененияЦен.Номенклатура, ИзмененияЦен.Цена ПОМЕСТИТЬ ИтоговыеЦены ИЗ ИзмененияЦен КАК ИзмененияЦен ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЦеныНаНачало.Период, ЦеныНаНачало.Номенклатура, ЦеныНаНачало.Цена ИЗ ЦеныНаНачало КАК ЦеныНаНачало ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ТЧ.Номенклатура, ТЧ.ДатаС, ТЧ.ДатаПо, ИтоговыеЦены.Период, ИтоговыеЦены.Цена ИЗ ТЧ КАК ТЧ ЛЕВОЕ СОЕДИНЕНИЕ ИтоговыеЦены КАК ИтоговыеЦены ПО ТЧ.Номенклатура = ИтоговыеЦены.Номенклатура |
|||
41
Wobland
25.06.14
✎
18:22
|
(40) смущает то, что подтягиваются прошлые цены
|
|||
42
Wobland
25.06.14
✎
18:22
|
(41) ну.. не из периода ТЧ документа
|
|||
43
Enders
25.06.14
✎
18:32
|
(40) Ещё раз присоединить цены
Только по условию что период второй таблицы больше периода первой таблицы цен. Потом сгруппировать и получим: Период первой таблицы это ДатаС, если она меньше чем датаДокумента - берём дату документа. а период второй таблицы это датаПо, если его нет, то берём дату из документа. Мб как, то так?) |
|||
44
Wobland
25.06.14
✎
18:37
|
ступил.
ГДЕ ЦеныНоменклатурыСрезПоследних.Период МЕЖДУ &ДатаС И &ДатаПо это в срезе последних цен. вроде всё как надо |
|||
45
Wobland
25.06.14
✎
18:38
|
цены на крайнюю дату в ТЧ ещё докрутить...
|
|||
46
Enders
25.06.14
✎
18:42
|
(44) А ты срез то берёшь на ДатуС какой период между?Оо
|
|||
47
Wobland
25.06.14
✎
18:47
|
(46) чтоб выкинуть цены, установленные в пятом году и не менявшиеся с тех пор. там же ещё измерение ТипЦены, я его тут не учитывал. да и вообще могу быть неправ ;)
|
|||
48
Enders
25.06.14
✎
18:54
|
(47) а зачем их выкидывать? они ж до сих пор актуальные, просто не будут влиять на итоговый период. Может как в (43)?)
Да и не совсем понятно, ты берёшь срез последних на 01.06.2014 00:00:00 и тут же ставишь условие на период между 01.06.2014 и 01.07.2014? или я тут не допонял?) |
|||
49
Wobland
25.06.14
✎
19:00
|
перегрелся я слегка. достаточно было фильтровать по типу цены (ну регистр у меня такой ;) и никаких где
|
|||
50
Wobland
25.06.14
✎
19:01
|
кстати, первым делом тупо скопипастил (29) - не взлетело
|
|||
51
Enders
26.06.14
✎
12:02
|
Вроде работает:
началоПериода и КонецПериода это пункт 1,2 из (29)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |